Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Транзакции и исключения в MSSQL 2012 и Delphi 2010 / 16 сообщений из 16, страница 1 из 1
21.03.2018, 22:55
    #39618551
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
У меня программа работает в MSSQL 2012 и Delphi 2010. Часто нужно бывает сделать действие в одной транзакции, чтобы в случае какой-нибудь ошибки все изменения базы данных откатились. С MSSQL я работаю через компоненты SDAC 6.11.23.
Это выполняется 2-мя разными способами
1)Через Delphi
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
procedure TActionSrv.Commit_IfNeed(var NewTran: boolean);
begin
  if NewTran then Conn1.Commit;
end;

procedure TActionSrv.Rollback_IfNeed(var NewTran: boolean);
begin
  if NewTran then Conn1.Rollback;
end;

procedure TActionSrv.StartTransaction_IfNeed(var NewTran: boolean);
begin
  NewTran:=not Conn1.InTransaction;
  if NewTran then Conn1.StartTransaction;
end;

var 
    NewTran : boolean;
begin
  StartTransaction_IfNeed(NewTran);
  try

    //Само действие

    Commit_IfNeed(NewTran);
  except
    Rollback_IfNeed(NewTran);
    Raise;
  end;
end;


2)Только через MSSQL средствами T-SQL

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
begin try
   begin tran

    --Само действие
 


   commit tran

 end try
 begin catch
	rollback tran
	exec aip_Raise
 end catch

где

create PROCEDURE [dbo].[aip_Raise] 
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	DECLARE @ErrMsg NVARCHAR(4000), @ErrSeverity int, @ErrState int
	
	Select 
	@ErrMsg = ERROR_MESSAGE(),
	@ErrSeverity = ERROR_SEVERITY(),
	@ErrState = ERROR_STATE()
	
	RAISERROR(@ErrMsg,@ErrSeverity,@ErrState)
END



База последнее время сильно разрослась и нагрузка на неё стала большая
и иногда стали возникать ошибки блокировки транзакции
"Превышено время ожидания запроса на блокировку."
При работе с 2-м способом (ч/з T-SQL) были очень, очень редко замечены странности типа не закомиченой транзакции и даже нарушения целостности изменений данных. Но это настолько редко (1 может быть к 100 000) что можно сказать что эти наблюдения практически из области мифов и точным свидетельством служить не могут.
Раньше работа с транзакциями была только через Delphi (1-й способ). Потом стали потихоньку вводить работу через T-SQL.
Недавно я прочитал несколько статей в которых говориться что некоторые исключения (очень сильные, резкие) T-SQL уловить не может и тогда транзакция остается незакомиченной. Даже советовали такие места помещать в динамический SQL а его выполнять в sp_execute которую обрамлять обработко исключений в T-SQL
Скажите пожалуйста, может ли действительно 2-способ (ч/з T-SQL) когда либо оставлять не закомиченные транзакции?
(1-способ (через Delphi) как я понимаю в принципе не может). И стоит ли мне всегда избавляться от этого 2-го способа
...
Рейтинг: 0 / 0
21.03.2018, 23:29
    #39618563
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
bilov,

1) Через Delphi можно работать так же, как если бы на сервере. За SDAC 6.11.23. ничего сказать не могу, но с помощью АДО в рамках одной сессии, запросто
Delphi
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ADOCommand.CommandText:='Begin tRan Tr1';
ADOCommand.Execute;
try
...
ADOCommand.CommandText:='Commit Tran Tr1';
ADOCommand.Execute;
except
ADOCommand.CommandText:='RollBack Tran Tr1';
ADOCommand.Execute;
end;



Проблем никаких нет, кроме ненужной загрузки сети.
2) Незаконченной транзакция может быть из-за криворукости программистов. Те-же бесконечные циклы (хотя они априори не должны находиться внутри транзакций)... Основное правило: транзакция должна быть короткой...
3) автор1-способ (через Delphi) как я понимаю в принципе не может Очень глубокое заблуждение... Возможно, именно Вашим способом и нет...
...
Рейтинг: 0 / 0
21.03.2018, 23:37
    #39618567
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
bilov,

И да... Основное преимущество работы на MSSQL сервере:
https://professorweb.ru/my/sql-server/2012/level3/3_2.php
...
Рейтинг: 0 / 0
22.03.2018, 04:08
    #39618588
Малвара
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
Gerasimenko,

Блин. Издержки серых ников...
...
Рейтинг: 0 / 0
22.03.2018, 08:48
    #39618621
Uridian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
bilov,
Ошибка "Превышено время..." при работе дельфийской программы может возникать, когда сессионная настройка LOCK_TIMEOUT на SQL-сервере установлена в значение, отличное от значения по умолчанию. Если ты сам не изменял эту настройку, то вероятнее всего это сделал за тебя компонент доступа SDAC. Я, например, столкнулся с таким же поведением компонента при работе с FireDAC, (что оказалось неприятной неожиданностью после ADO).
Блок try-catch в transact-sql отлавливает не все ошибки, поэтому "странности незакомиченой транзакции" могут возникать. Подробнее в справке
...
Рейтинг: 0 / 0
22.03.2018, 09:05
    #39618627
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
МалвараGerasimenko,

Блин. Издержки серых ников...
Пёс его знает: у меня с двух разных машин и с разными антивирусами: усе у порядку... Но лучше перебдеть...
...
Рейтинг: 0 / 0
22.03.2018, 17:22
    #39619061
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
Gerasimenko,
у меня прога лежит на самом компе-сервере, она сервер приложений и связывается с другими прогами клиентскими.
...
Рейтинг: 0 / 0
22.03.2018, 17:27
    #39619067
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
Uridian, компонент коннекшен у меня
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
object Conn1: TMSConnection
  Database = 'MyDB'
  Authentication = auWindows
  Options.ApplicationName = 'MyProg'
  Options.DefaultLockTimeout = 5000
  Options.Provider = prNativeClient
  Server = 'MySERVER'
  AfterConnect = Conn1AfterConnect
  LoginPrompt = False
  Left = 6
  Top = 4
end


Из того что сказали Вы и большинство остальных я могу понять что от способа который без Delphi надо постепенно избавляться. С точки зрения сети оба способа эквивалентны так как моя прога лежит на самой машине-сервере
...
Рейтинг: 0 / 0
22.03.2018, 18:01
    #39619090
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
bilovUridian, компонент коннекшен у меня
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
object Conn1: TMSConnection
  Database = 'MyDB'
  Authentication = auWindows
  Options.ApplicationName = 'MyProg'
  Options.DefaultLockTimeout = 5000
  Options.Provider = prNativeClient
  Server = 'MySERVER'
  AfterConnect = Conn1AfterConnect
  LoginPrompt = False
  Left = 6
  Top = 4
end


Из того что сказали Вы и большинство остальных я могу понять что от способа который без Delphi надо постепенно избавляться. С точки зрения сети оба способа эквивалентны так как моя прога лежит на самой машине-сервере
C точностью до наоборот. MSSQL - сервер оптимизирует и компилирует свои конструкции. Через делфи, на сколько хватит оперативки...
...
Рейтинг: 0 / 0
23.03.2018, 23:10
    #39619867
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
Gerasimenko,

Спасибо, услышал. Буду думать
...
Рейтинг: 0 / 0
24.03.2018, 17:28
    #39620006
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
bilov
Код: pascal
1.
2.
3.
4.
procedure TActionSrv.Commit_IfNeed(var NewTran: boolean);
begin
  if NewTran then Conn1.Commit;
end;



Если верить в компилятор, библиотеку доступа, OLEDB драйвер, в Виндовс, в физическую сеть, то разницы нет.
Но в серьёзной работе, надеюсь, за такое надают по рукам, когда что-то подвиснет и весь офис будет сидет в блокировке.

Единственно возможный способ- делать это на sql сервере. Остальное- студенчество или (пост)модернизм.
...
Рейтинг: 0 / 0
25.03.2018, 00:41
    #39620058
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
tunknown,

У меня сомнения не насчет транзакции больше, а насчет обработки исключений. Вы считаете что
Код: sql
1.
2.
3.
4.
5.
6.
begin try
    --Само действие
 end try
 begin catch

 end catch


будет всегда обрабатывать исключения? И это также надежно как
Код: pascal
1.
try except end

? А как же это статья ?
"Ошибки, не обрабатываемые конструкцией TRY…CATCH
Конструкции TRY…CATCH не обрабатывают следующие условия.
..."
...
Рейтинг: 0 / 0
25.03.2018, 17:26
    #39620164
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
bilovУ меня сомнения не насчет транзакции больше, а насчет обработки исключений. Вы считаете что

будет всегда обрабатывать исключения? И это также надежно как
?

Это разные уровни обработки и их нужно применять по ситуации.
Меня огорчает транзакция, начатая в Delphi.
...
Рейтинг: 0 / 0
25.03.2018, 22:48
    #39620229
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
tunknown,

Мне
Код: pascal
1.
NewTran:=not Conn1.InTransaction;

тоже не очень нравится, по идее там где метод является частью атомарной операции логичнее, надежнее прописывать это дельфишным параметром этого метода, а не зависеть от Conn1.InTransaction. Но 10лет работает, не буду трогать его пока.
...
Рейтинг: 0 / 0
28.03.2018, 10:13
    #39621759
Sevolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
bilov, еще вот это гляньте.

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/set-xact-abort-transact-sql


В моей практике такая команда уменьшала вероятность нарушения целостности данных.

Код: sql
1.
set xact_abort on
...
Рейтинг: 0 / 0
31.03.2018, 00:36
    #39623610
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции и исключения в MSSQL 2012 и Delphi 2010
Sevolod,
Спасибо посмотрю
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Транзакции и исключения в MSSQL 2012 и Delphi 2010 / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]