事务——sql server中的事务应用举例
sql中事务只针对一个update,delete,insert语句,如果一段程序中有超过一个这样的语句,就需要每个都判断是否出错,否则就会出现若干我们不希望的情形出现,举例如下(表结构见最后):
1,有三个insert语句(or其它语句),第一个出错,第二个对了,第三个错了,如下:
BEGIN
BEGIN TRANSACTION
print 'bb'
insert into testNewID (a) values('aa')
IF @@error <> 0
BEGIN
print '1'
ROLLBACK TRANSACTION
return
END
-- select * from dd
insert into testNewID(id,a) values(2,'bb')
IF @@error <> 0
BEGIN
print '2'
ROLLBACK TRANSACTION
return
END
insert into testnewid(a) values('cc')
IF @@error <> 0
BEGIN
print '3'
ROLLBACK TRANSACTION
return
END
BEGIN
print 'finished'
COMMIT TRANSACTION
END
SET NOCOUNT OFF
END
--
--delete from testnewid
--select * from testNewID
这样写就没问题,因为每个insert语句都经过了判断,一旦出错,回滚整个事务。如果这样写:
2,
BEGIN
BEGIN TRANSACTION
print 'bb'
insert into testNewID (a) values('aa')
insert into testNewID(id,a) values(2,'bb')
insert into testnewid(a) values('cc')
IF @@error <> 0
BEGIN
print '3'
ROLLBACK TRANSACTION
return
END
BEGIN
print 'finished'
COMMIT TRANSACTION
END
SET NOCOUNT OFF
END
--
--delete from testnewid
--select * from testNewID
这样的话@@error只收到最后一个insert语句的信息,它是对的,所以@@error的值是0,没错,所以不回滚,commit语句执行,第一个插入成功,第二个失败,第三个成功,没有起到事务的作用。
另外,如果程序中除了insert,update,delete之外的语句出现错误,那么整个程序停止,和事务没有关系。事务只针对insert,update,delete这三种操作。
附:用到的表结构 testnewid(id,a),id自增
以上是我自己的一点小经验,可能有不对和不完善的地方,哪位看到了请千万指出来,万分感谢。
今天得到tony的指点,原来这个事务可以优化一下,变得简单:
Begin TRANSACTION
DECLARE @Err int
SET @Err = 0
--在每一个操作语句之后(包括select等除update,insert,delete之外的语句)判断一下@@error
IF @@error <> 0
Set @Err = @@Error
--如果以上的操作中有一个有问题,那么@Err肯定不是零了。就 rollback,如果是零说明没有出错的,
--就commit
IF @Err <> 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述