sql server 中的某个嵌套事务可否独立于外层事务提交?而不被外层事务回滚?
如下:能否事务B不回滚?请高手赐教。
----------事务A开始-------------
....
[----------事务B开始------------]
....操作
[----------事务B提交------------]....错误
----------事务A回滚-------------
如下:能否事务B不回滚?请高手赐教。
----------事务A开始-------------
....
[----------事务B开始------------]
....操作
[----------事务B提交------------]....错误
----------事务A回滚-------------
begin tran --事务1
--SQL
save transaction a
begin tran --事务2
--SQL
commit tran
rollback transaction a
--SQL
commit tran
....
[----------事务B开始------------]
....操作
[----------事务B提交------------]
<在这个加入以下代码段1>
....错误
<在这个加入以下代码段2>
----------事务A回滚--------------------------------------------------------------
代码段1:
设回滚点A1,
判断IsErr1,是错误回滚过来的,这里就提交事务2不走后面了。不是就正常走。代码段2:
如果出错,给一个全局变量IsErr1赋值True。回滚时回滚到回滚点A1.--------------------------------------------------
但这种跳来跳去的代码要小心。
create table demo(name varchar(10) primary key,val varchar(20))
gobegin transaction
insert into demo values('BB','B term')
save transaction A
insert into demo values('BB','B term')
rollback TRANSACTION Aselect * from demodrop table demo/***********消息 2627,级别 14,状态 1,第 5 行
违反了 PRIMARY KEY 约束 'PK__demo__76AC771E'。不能在对象 'dbo.demo' 中插入重复键。
语句已终止。
name val
---------- --------------------
BB B term(1 行受影响)
没有保存点的create table demo(name varchar(10) primary key,val varchar(20))
gobegin transaction
insert into demo values('BB','B term')
--save transaction A
insert into demo values('BB','B term')
rollback TRANSACTIONselect * from demodrop table demo/************消息 2627,级别 14,状态 1,第 5 行
违反了 PRIMARY KEY 约束 'PK__demo__7A7D0802'。不能在对象 'dbo.demo' 中插入重复键。
语句已终止。
name val
---------- --------------------(0 行受影响)
GO
CREATE TABLE #T(COL1 INT)
GO
BEGIN TRAN
INSERT INTO #T
SELECT 1
BEGIN TRAN
INSERT INTO #T
SELECT 2
--这里的提交没鸟用,会被下面的ROLLBACK效果覆盖
COMMIT TRAN INSERT INTO #T
SELECT 3
ROLLBACK TRAN
SELECT * FROM #T
GO
TRUNCATE TABLE #T
GO
BEGIN TRAN
INSERT INTO #T
SELECT 1
BEGIN TRAN
INSERT INTO #T
SELECT 2
--这里的ROLLBACK就直接把两个事务都回滚了,下面的COMMIT会报错
ROLLBACK TRAN INSERT INTO #T
SELECT 3
COMMIT TRAN
SELECT * FROM #T