这个存储过程确实没必要嵌套n多的事务。只有一种情况下,就是用savepoint xx,然后你可以commit xx 或者rollback xx。
create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣 begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚 save transaction @TransactionName rollback transaction @TransactionName commit transaction end 这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣; 插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?
create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣 begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚 save transaction @TransactionName rollback transaction @TransactionName commit transaction end 这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣; 插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣 begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以 ---begin transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚 save transaction @TransactionName rollback transaction @TransactionName commit transaction end
测试了,这样写可以,第二个事务不用begin --CREATE TABLE test (id VARCHAR(10),NAME VARCHAR(10))SELECT * FROM test ALTER PROCEDURE test_pro AS BEGIN
--想实现插入小马哥,不插入孙大圣 BEGIN TRANSACTION
INSERT INTO test VALUES ( '998888', '小马哥' ) --就插入这一条
--BEGIN TRANSACTION t2 SAVE TRANSACTION t2 INSERT INTO test VALUES ( '998887', '孙大圣') --这条插入后,马上回滚
ROLLBACK TRANSACTION t2
COMMIT TRANSACTION END
create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣 begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚 save transaction @TransactionName rollback transaction @TransactionName commit transaction end 这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣; 插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣 begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以 ---begin transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚 save transaction @TransactionName rollback transaction @TransactionName commit transaction end 你说的也对,不过要把那个save 要放在insert的前面,就是7楼说的那样。
create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣 begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚 save transaction @TransactionName rollback transaction @TransactionName commit transaction end 这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣; 插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣 begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以 ---begin transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚 save transaction @TransactionName rollback transaction @TransactionName commit transaction end 你说的也对,不过要把那个save 要放在insert的前面,就是7楼说的那样。我的复合你要求了?
你说的是对的。还有一个疑问,不知道怎么解释? --我把倒数2,3行的rollback 和commit颠倒了下。实现先分别插入两条记录,最后的rollback把里面的插入都撤销了。为什么这里save transaction @TransactionName 之前一定要写begin transaction @TransactionName,不写提出那个计数器错误。 --而没有颠倒前的代码,为什么可以直接写save transaction @TransactionName,前面不用begin先申明啊? create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'begin transactioninsert into Student values('998888','小马哥','国际贸易','22') begin transaction @TransactionName save transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') commit transaction @TransactionNamerollback transactionend
还有一个疑问啊!create procedure test_pro as beginDECLARE @TransactionName varchar(20) set @TransactionName ='Transaction1'begin transactioninsert into Student values('998888','小马哥','国际贸易','22') begin transaction @TransactionName save transaction @TransactionName insert into Student values('998887','孙大圣','工商管理','99') rollback transaction @TransactionName --这里rollback了不插入孙大圣rollback transaction --这里总体rollback了,小马哥没有插入可以理解,不过孙大圣也没有插入有点疑问。rollback的rollback不是commit吗?end
create procedure test_pro
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
save transaction @TransactionName
rollback transaction @TransactionName
commit transaction
end
这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣;
插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?
create procedure test_pro
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
save transaction @TransactionName
rollback transaction @TransactionName
commit transaction
end
这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣;
插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure test_pro
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以
---begin transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
save transaction @TransactionName
rollback transaction @TransactionName
commit transaction
end
--CREATE TABLE test (id VARCHAR(10),NAME VARCHAR(10))SELECT * FROM test
ALTER PROCEDURE test_pro
AS
BEGIN
--想实现插入小马哥,不插入孙大圣
BEGIN TRANSACTION
INSERT INTO test
VALUES ( '998888', '小马哥' ) --就插入这一条
--BEGIN TRANSACTION t2
SAVE TRANSACTION t2
INSERT INTO test
VALUES ( '998887', '孙大圣') --这条插入后,马上回滚
ROLLBACK TRANSACTION t2
COMMIT TRANSACTION
END
create procedure test_pro
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
save transaction @TransactionName
rollback transaction @TransactionName
commit transaction
end
这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣;
插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure test_pro
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以
---begin transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
save transaction @TransactionName
rollback transaction @TransactionName
commit transaction
end
你说的也对,不过要把那个save 要放在insert的前面,就是7楼说的那样。
create procedure test_pro
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
save transaction @TransactionName
rollback transaction @TransactionName
commit transaction
end
这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣;
插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure test_pro
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以
---begin transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
save transaction @TransactionName
rollback transaction @TransactionName
commit transaction
end
你说的也对,不过要把那个save 要放在insert的前面,就是7楼说的那样。我的复合你要求了?
你说的是对的。还有一个疑问,不知道怎么解释?
--我把倒数2,3行的rollback 和commit颠倒了下。实现先分别插入两条记录,最后的rollback把里面的插入都撤销了。为什么这里save transaction @TransactionName 之前一定要写begin transaction @TransactionName,不写提出那个计数器错误。
--而没有颠倒前的代码,为什么可以直接写save transaction @TransactionName,前面不用begin先申明啊?
create procedure test_pro
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'begin transactioninsert into Student values('998888','小马哥','国际贸易','22')
begin transaction @TransactionName
save transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99')
commit transaction @TransactionNamerollback transactionend
as
beginDECLARE @TransactionName varchar(20)
set @TransactionName ='Transaction1'begin transactioninsert into Student values('998888','小马哥','国际贸易','22')
begin transaction @TransactionName
save transaction @TransactionName
insert into Student values('998887','孙大圣','工商管理','99')
rollback transaction @TransactionName --这里rollback了不插入孙大圣rollback transaction --这里总体rollback了,小马哥没有插入可以理解,不过孙大圣也没有插入有点疑问。rollback的rollback不是commit吗?end