sql数据库回滚操作_sql回滚语句 rollback

2022-09-27 10:30:36 浏览数 (2)

大家好,又见面了,我是你们的朋友全栈君。

create table testtable (

id nvchart(50) prim key,

name nvchart(50),

remark nvchart(50)

)

select * from testtable

go BEGIN TRY — SQL Server 需要显示的定义 开始一个事务. BEGIN TRANSACTION; — 插入2条同样的数据,使主键重复,引发错误后回滚事务. INSERT INTO testtable(id, name) VALUES (4, ‘FOUR’); INSERT INTO testtable(id, name) VALUES (4, ‘FOUR’); — 执行成功后,需要提交事务. COMMIT; END TRY BEGIN CATCH PRINT(‘Main.错误代码 = ‘ STR(ERROR_NUMBER())); PRINT(‘Main.错误严重级别 = ‘ STR(ERROR_SEVERITY())); PRINT(‘Main.错误状态代码 = ‘ STR(ERROR_STATE())); PRINT(‘Main.错误信息 = ‘ ERROR_MESSAGE()); — 回滚事务 ROLLBACK; END CATCH

go select * from testtable;

go

二、嵌套事务的层次是由@@TranCount全局变量反映出来的。

每一次Begin Transaction都会引起@@TranCount加1。而每一次Commit Transaction都会使@@TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。 例如 BEGIN TRAN –@@TRANCOUNT值为0 SELECT @@TRANCOUNT –值为1 BEGIN TRAN SELECT @@TRANCOUNT –值为2 COMMIT TRAN SELECT @@TRANCOUNT –值为1 ROLLBACK TRAN SELECT @@TRANCOUNT –值为0 三、

在SQL Server中使用rollback会回滚所有的未提交事务状态,但是有些时候我们只需要回滚部分语句,把不需要回滚的语句提到事务外面来,虽然是个方法,但是却破坏了事务的ACID。

其实我们可以使用SQL Server中的Savepoints来解决上述问题。

示例如下:

1.先建立测试表: CREATE TABLE [dbo].[ttt]( [Id] [int] NULL, [mark] [int] NULL )

2.SQL 语句 begin tran insert into ttt values(3,’3′); save tran point1 insert into ttt values(4,’4′);

rollback tran point1

commit

执行结果如下: Id mark 3 3

可见,虽然3,4都在一个事务中,但是由于使用了SavePoints,所以3被提交了,4被回滚了。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179247.html原文链接:https://javaforall.cn

0 人点赞