Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Rollback и trigger  [new]
asilkhan
Member

Откуда:
Сообщений: 21
Всем доброго времени суток.
Исходные: есть 2 таблицы(Таб1, Таб2). Таб2 заполняется автоматически посредством триггера в Таб1. Когда что нибудь вставляется, меняется в Таб1 это фиксируется в Таб2. Есть приложение которое активно работает только с Таб1. В логике приложения заложены некоторые условия корректности данных для новых вставляемых строк в Таб1. Если некое условие не выполняется то после операции insert для Таб1 идет откат транзакции посредством Rollback.
Проблема: дело в том что иногда Rollback не срабатывает и вставленная строка так и остается в Таб1.
Вопрос 1: мне кажется это связано с наличием триггера, так как запись вставленную триггером в Таб2 тоже ведь надо откатить. Если это так подтвердите мои подозрения.
Вопрос 2: как совместить использование этих двух понятий триггер и rollback.
Дайте хотя бы направление в котором копать.
Заранее спасибо.
5 сен 14, 07:55    [16538025]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
asilkhan
мне кажется это связано с наличием триггера
Это вам только кажется. Операции в триггере тоже откатываются.
+
use tempdb
go

if object_id(N'tempdb..tmp1') is not null
	drop table dbo.tmp1
GO
if object_id(N'tempdb..tmp2') is not null
	drop table dbo.tmp2
GO

create table dbo.tmp1 (i int)
go
create table dbo.tmp2 (i int)
go

create trigger dbo.tr_tmp1 on dbo.tmp1
after insert
as
		insert dbo.tmp2 (i)
		select i*10 i
		from inserted
go

insert dbo.tmp1 (i) values (1)

BEGIN TRAN

	insert dbo.tmp1 (i) values (2)
	insert dbo.tmp1 (i) values (3)

ROLLBACK TRAN

select * from dbo.tmp1
select * from dbo.tmp2
Вы уже проверили, что делает ваше приложение?
asilkhan
Есть приложение которое активно работает только с Таб1.
А пассивно оно с чем работает? :)

Если у вас остается уверенность, что дело в триггере, то покажите код триггера.
5 сен 14, 08:16    [16538051]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
asilkhan
Member

Откуда:
Сообщений: 21
код триггера

+
CREATE TRIGGER [dbo].[IASSALHEAD_TR1]
   ON [dbo].[IASSALHEAD] 
   AFTER INSERT, UPDATE
AS 
BEGIN
	INSERT INTO JAKEDIREESTR SELECT 'IASSALHEAD' TABLEHEAD,'IASSALITEM' TABLEITEM,'DOCTYPE' TYPENAME,'DOCNUM' NUMNAME,
		inserted.DOCTYPE TYPEVAL, inserted.DOCNUM NUMVAL,0 STATUS,GETDATE() CREATEDAT,'' CHANGEDAT,'' DETAILSTATUS FROM inserted
END


Под фразой "активно работает с Таб1" имелось в виду что Таб2 приложение не трогает на данном этапе.
Таб1 это таблица для операционной деятельности пользователей, а Таб2 это некий реестр для фиксации изменений(совсем грубое объяснение, но надеюсь поймете).
5 сен 14, 08:22    [16538057]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
asilkhan,

Здесь нет ничего, чтобы хотя бы потенциально могло быть причиной вашей проблемы.
Вы хоть воспроизвели ошибку именно на сервере с ролбеком или это ваши предположения?
5 сен 14, 08:50    [16538117]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
asilkhan
Дайте хотя бы направление в котором копать.
В сторону анализа кода вашего приложения. Потому что rollback не может "не сработать".
5 сен 14, 09:06    [16538159]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
asilkhan
Проблема: дело в том что иногда Rollback не срабатывает и вставленная строка так и остается в Таб1.
У MSSQL нет возможности не откатывать при rollback часть изменений в постоянных таблицах, которые были сделаны в транзакции. И неважно, где были сделаны эти изменения - в траггере, в хранимой процедуре, запросами от клиента.

Так что ищите место, где эти неоткатываемые изменения делаются вне транзакции (например, приложение может их делать в другом коннекте, хотя на первый взгляд этого не видно, или есть где то ошибка в логике управления транзакциями).
5 сен 14, 09:08    [16538165]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
asilkhan
Member

Откуда:
Сообщений: 21
спасибо за ответы.
Такой вопрос: приложение делает вставку новой строки в Таб1(предварительно запустив BEGINTTRAN), далее идет проверка значений для новой строки, какой то столбец не проходит проверку, приложение запускает ROLLBACK. Замечу что COMMITTRAN стоит после вызова ROLLBACK(в этом я уверен).
Так вот в какой момент происходит срабатывание триггера? если триггер сработал до ROLLBACK, то как СУБД откатить вставленную строку для Таб2? или в приложении нужно писать ROLLBACK для всех таблиц связанных посредством триггера?

Воспроизвести не получается, не могу понять в каких ситуациях это исключение возникает. Иногда приложение не откатывает транзакцию, а в 90% случаях можно сказать все делается корректно.
5 сен 14, 10:03    [16538390]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
asilkhan
Такой вопрос: приложение делает вставку новой строки в Таб1(предварительно запустив BEGINTTRAN), далее идет проверка значений для новой строки, какой то столбец не проходит проверку, приложение запускает ROLLBACK. Замечу что COMMITTRAN стоит после вызова ROLLBACK(в этом я уверен).
Так вот в какой момент происходит срабатывание триггера?
В момент "сразу после выполнения физической вставки данных в таблицу Таб1"
asilkhan
если триггер сработал до ROLLBACK, то как СУБД откатить вставленную строку для Таб2? или в приложении нужно писать ROLLBACK для всех таблиц связанных посредством триггера?
ROLLBACK выполняется для всех изменений во всех таблицах, которые были сделаны с момента BEGINTTRAN. Независимо от того, где делались изменения. Я ведь уже писал об этом.

Вы просто где то прерываете транзакцию, до вставки данных в таблицу Таб1, либо вообще не начинаете её.

Просто отладьте код. Вставьте, например, проверку уровня транзакций после оператора вставки данных в таблицу Таб1, и генерируйте исключение, если транзакции нет. И сразу всё будет видно. А то сейчас вы говорите только предположениями, гипотезами, "Замечу что COMMITTRAN стоит после вызова ROLLBACK(в этом я уверен)."

И вообще, эти изменения в Таб2 могут быть сделаны совсем другим кодом, из другой программы. Просто поставьте проверки и отладьте.
5 сен 14, 10:18    [16538450]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
alexeyvg,
автор
Такой вопрос: приложение делает вставку новой строки в Таб1(предварительно запустив BEGINTTRAN), далее идет проверка значений для новой строки, какой то столбец не проходит проверку, приложение запускает ROLLBACK.


Отвратительный алгоритм. Проверку надо выполнять ДО каких-либо операций по изменению таблицы.
5 сен 14, 11:16    [16538805]     Ответить | Цитировать Сообщить модератору
 Re: Rollback и trigger  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Ник не тот.
5 сен 14, 11:17    [16538810]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить