大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
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被回滚了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179247.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...