Достаточно ли использовать коммит в транзакции? - PullRequest
1 голос
/ 25 июня 2011

Использует Commit в transaction достаточно, или я должен использовать rollback тоже.

tabel1
  name   nvarchar(10)
  family nvarchar(20)

table 2 
    name nvarchar(10)
    family nvarchar(20) not null

begin transaction
insert into table2 (name) values('john')
insert into table1 (name,family) values('Joe','Lando')
commit transaction

как видите, в первом утверждении есть ошибка. я должен использовать откат где-то?

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Вы можете пропустить ROLLBACK, если используете SET XACT_ABORT ON (ссылка на SQL Server 2000)

SET XACT_ABORT ON
begin transaction
insert into table2 (name) values('john')
insert into table1 (name,family) values('Joe','Lando')
commit transaction

Из ссылки:

Когда SET XACT_ABORT установлен в ON, если инструкция Transact-SQL вызывает ошибку во время выполнения, вся транзакция завершается и откатывается.

Теперь, если вы не используете его, вам потребуется откат. Или закройте соединение.

Одним полезным побочным эффектом SET XACT_ABORT ON является то, что после события клиента CommandTimeout блокировки снимаются, а транзакции откатываются. В противном случае это не произойдет, пока соединение не будет hard удалено из SQL Server: оно может оставаться открытым из-за объединения в пул.

Ваша Библия должна быть "Обработка ошибок в SQL 2000 - фон" Эрланда Соммарского : прочитайте это. И на SO: Мне действительно нужно использовать "SET XACT_ABORT ON"?

0 голосов
/ 25 июня 2011

Во-первых, я сомневаюсь, что хранимая процедура на самом деле скомпилируется, потому что она распознает, что table2 не имеет поля 'family'.

Во-вторых, возможно, целесообразно включить некоторую форму проверки вашего здравомыслия, но в любом случае сервер SQL автоматически выполнит откат при ошибке.

...