在SQL Server中正确使用事务

在SQL Server中正确使用事务,sql,sql-server,database,tsql,transactions,Sql,Sql Server,Database,Tsql,Transactions,我有2个命令,需要两个都正确执行,或者一个都不执行。所以我想我需要一个事务,但我不知道如何正确使用它 下面的脚本有什么问题 BEGIN TRANSACTION [Tran1] INSERT INTO [Test].[dbo].[T1] ([Title], [AVG]) VALUES ('Tidd130', 130), ('Tidd230', 230) UPDATE [Test].[dbo].[T1] SET [Title] = N'az2' ,[AVG] = 1 WHERE

我有2个命令,需要两个都正确执行,或者一个都不执行。所以我想我需要一个事务,但我不知道如何正确使用它

下面的脚本有什么问题

BEGIN TRANSACTION [Tran1]

INSERT INTO [Test].[dbo].[T1]
    ([Title], [AVG])
VALUES ('Tidd130', 130), ('Tidd230', 230)

UPDATE [Test].[dbo].[T1]
  SET [Title] = N'az2' ,[AVG] = 1
  WHERE [dbo].[T1].[Title] = N'az'

COMMIT TRANSACTION [Tran1]
GO
执行
INSERT
命令,但
UPDATE
命令有问题


如果其中任何一个命令在执行过程中出现错误,我如何实现这一点以回滚这两个命令?

添加一个try/catch块,如果事务成功,它将提交更改;如果事务失败,则回滚事务:

begintransaction[Tran1]
开始尝试
插入[测试].[dbo].[T1]([标题],[AVG])
值('Tidd130',130),('Tidd230',230)
更新[Test].[dbo].[T1]
集合[标题]=N'az2',[平均值]=1
其中[dbo].[T1].[Title]=N'az'
提交事务[Tran1]
结束尝试
开始捕捉
回滚事务[Tran1]
端接

在存储过程的开头,应该放上指示Sql Server在出现错误时自动回滚事务的命令。如果ommited或设置为OFF,则需要在每个语句或使用块之后进行测试。

简易方法:

CREATE TABLE T
(
    C [nvarchar](100) NOT NULL UNIQUE,
);

SET XACT_ABORT ON -- Turns on rollback if T-SQL statement raises a run-time error.
SELECT * FROM T; -- Check before.
BEGIN TRAN
    INSERT INTO T VALUES ('A');
    INSERT INTO T VALUES ('B');
    INSERT INTO T VALUES ('B');
    INSERT INTO T VALUES ('C');
COMMIT TRAN
SELECT * FROM T; -- Check after.
DELETE T;

开始事务[Tran1]
不应该放在
TRY
中吗?无论如何-非常简单而优雅的一段代码。@PiotrNawrot否,如果事务创建失败,则无需在捕获中回滚它。如果要查看错误,请将其包含在捕获中:
SELECT error\u MESSAGE()AS ErrorMessage
换句话说,除非您首先设置XACT_ABORT,否则您的事务不是原子事务。使用url下划线很难看到,但是
XACT_ABORT