嵌套事务为什么不能够回滚到我想要的保存点?

goodluck001 2007-04-18 05:51:11
我的数据库中有个表,字段如下:
CREATE TABLE [tab1] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[value] [int] NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
CONSTRAINT [PK_tab1] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO



然后我写了一段脚本来测试嵌套事务的问题:

begin transaction t
begin tran t_1 --第一次写入数据
insert tab1(value,name)
select 1,'1'
commit tran t_1
save tran s_1

begin tran t_2 --第二次写入数据
insert tab1(value,name)
select '2h','2'

if @@error!=0
begin
print('rollback tran s_1')
rollback tran s_1
end
else
commit tran t_2
commit tran t


理论上在执行到“第二次写入数据”时候出错就应该回滚到“s_1”,那么结果就只插入了一条数据,但是现在是如何测试都发现没有插入任何记录。

后来我还把代码改为下面两种代码也不行:
第一种:
begin transaction t
begin tran t_1 --第一次写入数据
insert tab1(value,name)
select 1,'1'
commit tran t_1
save tran s_1

begin tran t_2 --第二次写入数据
insert tab1(value,name)
select '2h','2'

if @@error!=0
begin
print('rollback tran t_2')
rollback tran t_2
end
else
commit tran t_2
commit tran t


第二种:
begin transaction t
begin tran t_1 --第一次写入数据
insert tab1(value,name)
select 1,'1'
commit tran t_1
save tran t_1

begin tran t_2 --第二次写入数据
insert tab1(value,name)
select '2h','2'

if @@error!=0
begin
print('rollback tran t_1')
rollback tran t_1
end
else
commit tran t_2
commit tran t
...全文
335 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
新鲜鱼排 2007-04-19
  • 打赏
  • 举报
回复
你用了三个事务。但是t_1和t_2无法共用一个保存点。
goodluck001 2007-04-19
  • 打赏
  • 举报
回复
SQL Server 2000里面的帮助文档是如下描述的:


ROLLBACK TRANSACTION 语句的 transaction_name 参数引用一组命名的嵌套事务的内层事务是非法的,transaction_name 只能引用最外部事务的事务名。如果在一组嵌套事务的任意级别执行使用外部事务名称的 ROLLBACK TRANSACTION transaction_name 语句,那么所有的嵌套事务都将回滚。如果在一组嵌套事务的任意级别执行没有 transaction_name 参数的 ROLLBACK WORK 或 ROLLBACK TRANSACTION 语句,那么它将回滚所有嵌套事务,包括最外部事务。



从中可以看出内层的事务的回滚应该是直接回滚到了最外层的事务开头。
goodluck001 2007-04-19
  • 打赏
  • 举报
回复
>>dutguoyi(新鲜鱼排)

还是不行!

代码如下:

begin transaction t
begin tran t_1 --第一次写入数据
insert tab1(value,name)
select 1,'1'
commit tran t_1

begin tran t_2 --第二次写入数据
save tran s_2
insert tab1(value,name)
select '2h','2'

if @@error!=0
begin
print('rollback tran s_2')
rollback tran s_2
end
else
commit tran t_2
commit tran t
内容概要:本文系统梳理了多个科研领域的前沿研究与技术实现,重涵盖FDTD方法中的完美匹配层(PML)研究,以及Matlab/Simulink在电磁、电力、控制、通信、信号处理、图像处理、路径规划、能源系统优化等领域的仿真与算法实现。文中列举了大量基于Matlab和Python的科研案例,如风电功率预测、负荷预测、无人机三维路径规划、电池系统故障诊断、雷达模拟、通信编码、微电网优化调度等,并强调结合智能优化算法(如粒子群、遗传算法、深度学习等)提升系统性能。同时,提供了丰富的代码资源与仿真模型,涵盖永磁同步电机控制、逆变器设计、多智能体任务分配、虚拟电厂调度等复杂系统,助力科研人员快速开展复现实验与创新研究。; 适合人群:具备一定编程基础,熟悉Matlab/Python工具,从事电气工程、自动化、通信、人工智能、新能源、控制科学等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习并实现FDTD仿真中的PML边界条件以有效抑制数值反射;② 掌握Matlab/Simulink在多物理场建模、控制系统设计与优化算法中的综合应用;③ 借助提供的代码资源完成科研复现、课程设计、竞赛项目或工程原型开发; 阅读建议:此资源以科研实战为导向,不仅提供理论方法,更强调代码实现与仿真验证。建议读者结合自身研究方向,按目录顺序查阅相关模块,下载配套代码进行调试与二次开发,以达到学以致用、融会贯通的目的。

22,297

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧