在SQL Server中正确使用事务
我有2个命令,需要两个都正确执行,或者一个都不执行。所以我想我需要一个事务,但我不知道如何正确使用它 下面的脚本有什么问题在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
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