Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Транзакции в TADOCommand и mssql  [new]
СферическийКуб
Member

Откуда:
Сообщений: 142
Хотелось бы понять, как работают транзакции в TADOCommand.
В коде явного управления транзакциями у меня нет, только вызов исполнения ADOCommand.Execute;
В целом все работает. Проблемы начинаются, когда сервер mssql начинает работать нестабильно(подвисает на ровном месте).
При чтении записи вставленные через ADOCommand.Execute видны в других соединениях, в ADOConnection изоляция ilReadCommitted, т.е. грязного чтения быть не может и записи реально вставлены и вроде бы закоммичены.
После рестарта службы некоторые записи исчезают.
При шатдауне логично, что сервер откатывает незавершенные транзакции, но как выше видно они по всем признакам выглядят закоммичеными.
Или в TADOCommand транзакции какое-то особенные? В соединении IMPLICIT_TRANSACTIONS нигде не ставится.
Как сделать, чтобы данные не исчезали после рестарта сервера?
7 май 18, 11:32    [21392466]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4430
СферическийКуб,

у тебя подвисшая транзакция.
Пока не произойдет явного разрыва ADOConnection: они будут висеть и творить чудеса...
7 май 18, 11:58    [21392592]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4430
СферическийКуб
...
Как сделать, чтобы данные не исчезали после рестарта сервера?

Без понятия, чего ты там творишь, посоветовать что-то не представляется возможным.
Ошибка кроется в
СферическийКуб
Проблемы начинаются, когда сервер mssql начинает работать нестабильно(подвисает на ровном месте)

Ровное место, не такое ровное, как кажется...
P.s.
Проверь наличие тригеров на изменяемые таблицы. Иногда о них можно не подозревать...
7 май 18, 12:16    [21392656]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
СферическийКуб
Member

Откуда:
Сообщений: 142
Gerasimenko
у тебя подвисшая транзакция.

А данном случае физически что это означает и как она получается?
У меня один экземпляр ADOCommand и на каждую запись в базу переиспользуется.

Проверь наличие тригеров на изменяемые таблицы. Иногда о них можно не подозревать...

Триггеры есть, но в них вроде ничего криминального нет.
В одном
for update
.....
error:
	raiserror (@errno, 11, 1, @errmsg)
	rollback  transaction

Но это на обновление, и оно нормально отрабатывает.
Если при обновлении какие-то данные не соответствуют логике, то тогда они отбрасываются.
ADOCommand после Execute автоматически коммитит умолчательную транзакцию или этот процесс не всегда однозначен? По вышеописанным данным, все-таки складывается ощущение, что коммиты проходят нормально, раз их видно в других коннектах.



Ровное место, не такое ровное, как кажется...

Очевидно, да. Но с этим я и хочу разобраться.
7 май 18, 13:07    [21392886]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4430
СферическийКуб,

автор
А данном случае физически что это означает и как она получается?
У меня один экземпляр ADOCommand и на каждую запись в базу переиспользуется.

Ты хочешь сказать, что не используешь ADOConnection?

автор
ADOCommand после Execute автоматически коммитит умолчательную транзакцию или этот процесс не всегда однозначен?

Допустим, ты запускаешь ХП, у которой есть Begin Tran, но до Commit or RollBack по каким то причинам не доходит. Пока ты не закроешь ADOConnection: будет подвисшая транзакция.

автор
Триггеры есть, но в них вроде ничего криминального нет.
В одном
Вот эти конструкции вполне себе могут организовать подвисшую транзакцию. Проверь пошагово в MSSQL все возможные варианты.

Если у тебя ADOCommand всегда в виде одноДейственной конструкции, то проблема явно на сервере.
Если ты открываешь транзакцию на клиенте, то и завершить ее надо на клиенте.
7 май 18, 14:11    [21393160]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1336
СферическийКуб,

Для начала можно посмотреть в SSMS в Activity Monitor параметр Open Trans у твоего коннекшена, динамику его изменения
7 май 18, 14:23    [21393188]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
СферическийКуб
Member

Откуда:
Сообщений: 142
Gerasimenko
Ты хочешь сказать, что не используешь ADOConnection?

Использую. В смысле один и тот же экземпляр ADOCommand приклеенный к единственному ADOConnection переиспользуется.
Все действия через ХП производятся.

Пока ты не закроешь ADOConnection: будет подвисшая транзакция.

И все дальнейшие вызовы ADOCommand.Execute будут в этой незавершенной транзакции производиться?
Хотя опять же, у меня ilReadCommitted при котором незакоммиченных изменений не видно. А тут данные видны.
А эта повисшая транзакция как может влиять на закоммиченные транзакции? Не могут же они откатиться.



Zelius
параметр Open Trans

У меня такого нет. Сервер и студия от него 2008R2.
7 май 18, 15:05    [21393295]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4430
СферическийКуб,

автор
И все дальнейшие вызовы ADOCommand.Execute будут в этой незавершенной транзакции производиться?
Хотя опять же, у меня ilReadCommitted при котором незакоммиченных изменений не видно. А тут данные видны.
А эта повисшая транзакция как может влиять на закоммиченные транзакции? Не могут же они откатиться.

А кто тебе сказал, что после открытой и НЕзавершенной транзакции остальные получили Commit?
Допустим по таймауту вылет, или ХП просто не дошла до Commit/RollBack и завершила работу. Транзакция на сервере не закрыта. Ты запускаешь следующие конструкции. Что по твоему будет происходить. В том числе и у других пользователей.
При этом, когда ты закроешь ADOConnection, будет откат всех незавершенных транзакций.
7 май 18, 15:13    [21393321]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4430
СферическийКуб,

в ХП возвращай результат. И все будет понятно.

var
 rs_:_RecordSet;
...
begin
...

rs_:=ADOCommand.Execute;
if rs.Field['NameField'].Values = ...
7 май 18, 15:17    [21393326]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1336
СферическийКуб
Gerasimenko
Ты хочешь сказать, что не используешь ADOConnection?

Использую. В смысле один и тот же экземпляр ADOCommand приклеенный к единственному ADOConnection переиспользуется.
Все действия через ХП производятся.

Пока ты не закроешь ADOConnection: будет подвисшая транзакция.

И все дальнейшие вызовы ADOCommand.Execute будут в этой незавершенной транзакции производиться?
Хотя опять же, у меня ilReadCommitted при котором незакоммиченных изменений не видно. А тут данные видны.
А эта повисшая транзакция как может влиять на закоммиченные транзакции? Не могут же они откатиться.



Zelius
параметр Open Trans

У меня такого нет. Сервер и студия от него 2008R2.

Студия - SQL Server Management Studio? Тогда должно быть, правой кнопкой по серверу или где то в Management узле
7 май 18, 15:20    [21393338]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
СферическийКуб
Member

Откуда:
Сообщений: 142
Gerasimenko
в ХП возвращай результат. И все будет понятно.

ХП какие есть.
Велосипед не мой, я только костыли подставляю.
Их тут несколько тысяч.

Gerasimenko
А кто тебе сказал, что после открытой и НЕзавершенной транзакции остальные получили Commit?

А как иначе они видны в других коннектах? В уровне изоляции у меня нет грязного чтения.
Zelius
Студия - SQL Server Management Studio?

Да, но там в мониторе нет количества транзакций.

К сообщению приложен файл. Размер - 73Kb
7 май 18, 15:34    [21393386]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1336
СферическийКуб,

а sys.sysprocesses доступен? там была open_tran колонка
7 май 18, 16:35    [21393593]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
СферическийКуб
Member

Откуда:
Сообщений: 142
Zelius,
Да, доступно, там есть.
Там сейчас все по нулям.

А, кстати, модель восстановления базы вообще может влиять на странное поведение?
У меня сейчас SIMPLE.
7 май 18, 16:47    [21393626]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1336
СферическийКуб
Zelius,
Да, доступно, там есть.
Там сейчас все по нулям.

А, кстати, модель восстановления базы вообще может влиять на странное поведение?
У меня сейчас SIMPLE.

нет
7 май 18, 16:47    [21393628]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1336
СферическийКуб,

могут влиять настройки соединения типа SET XACT_ABORT ON, SET NOCOUNT ON, либо глобально включить для всего сервера, либо в каждой процедуре писать первыми строками
7 май 18, 16:49    [21393636]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1336
СферическийКуб,

Посмотри как можно определить, включены ли неявные транзакции на сервере
7 май 18, 17:05    [21393682]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции в TADOCommand и mssql  [new]
СферическийКуб
Member

Откуда:
Сообщений: 142
Да, включены
@@TRANCOUNT = 0 AND (@@OPTIONS & 2 = 0)

В общем, на сколько я понял, при следующем торможении надо мониторить sys.sysprocesses
на предмет транзакций.

Типы тормозов бывают разные. Чаще всего это из-за индексов, перестройка которых помогает.
И более редкий тип - просто тормоз без причины при обращении к некоторым данным, тут только рестарт сервера помогает .
8 май 18, 07:49    [21394624]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить