求高手简单概括一下 Commit Trans 和 Rollback Trans 的具体区别??

chongachong 2004-11-22 10:25:11
执行Begin Trans后,Commit Trans 和 Rollback Trans 都是终止事务的执行的。
那具体有什么区别啊??

我觉得Rollback Trans 很多时候跟 Commit Trans 作用一样啊??

我现在概念很迷糊,分不清什么时候该用commit,什么时候该用rollback,可能钻进牛角尖了!!
所以求邹大侠及各位高手指点迷津....谢谢!谢谢^^
...全文
500 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chongachong 2004-11-22
  • 打赏
  • 举报
回复
那我怎么知道我写的语句,操作是否一定能成功呢?
所以,我怎么知道该用commit 还是rollback 来结束事务呢??

Andy__Huang 2004-11-22
  • 打赏
  • 举报
回复
存储过程和触发器中回滚
如果 @@TRANCOUNT 的值在存储过程完成时与过程执行时不同,则会生成一个 266 信息类错误。该错误不是由触发器中同一个条件生成的。

当调用存储过程时,如果 @@TRANCOUNT 为 1 或更大,并且该过程执行 ROLLBACK TRANSACTION 或 ROLLBACK WORK 语句,则会产生 266 号错误。这是因为 ROLLBACK 回滚所有未完成的事务,并将 @@TRANCOUNT 减到 0,该值比调用过程时要小。

如果在触发器中发出 ROLLBACK TRANSACTION:

对当前事务中的那一点所做的所有数据修改都将回滚,包括触发器所做的修改。


触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。


在批处理中,所有位于激发触发器的语句之后的语句都不被执行。


触发器中的 ROLLBACK 关闭并释放所有在包含激发触发器的语句的批处理中声明和打开的游标。这其中包括了在激发触发器的批处理所调用的存储过程中声明和打开的游标。在激发触发器的批处理之前的批处理中所声明的游标将只是关闭,但是在以下条件下,STATIC 或 INSENSITIVE 游标不关闭:
CURSOR_CLOSE_ON_COMMIT 设置为OFF。


静态游标要么是同步游标,要么是完全填充的异步游标。
当执行触发器时,触发器的操作总是好像有一个未完成的事务在起作用。如果激发触发器的语句是在隐性或显式事务中,则肯定会这样。在自动提交模式下,也是如此。当语句开始以自动提交模式执行时,如果遇到错误,则会有隐含的 BEGIN TRANSACTION 语句允许恢复该语句生成的所有修改。该隐含的事务对批处理中的其它语句没有影响,因为当语句完成时,该事务要么提交,要么回滚。但是,当调用触发器时,该隐含的事务将仍然有效。

这意味着,只要触发器中发出 BEGIN TRANSACTION 语句,则实际上就开始了一个嵌套事务。因为当回滚嵌套事务时,嵌套的 BEGIN TRANSACTION 语句将被忽略,触发器中发出的 ROLLBACK TRANSACTION 总是回滚过去该触发器本身发出的所有 BEGIN TRANSACTION 语句。ROLLBACK 回滚到最外部的 BEGIN TRANSACTION。

若要在触发器中进行部分回滚,则即使总是以自动提交模式进行调用,也必须使用 SAVE TRANSACTION 语句。以下的触发器阐明了这一点:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
SAVE TRANSACTION MyName
INSERT INTO TestAudit
SELECT * FROM inserted
IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION MyName
END

这也影响触发器中 BEGIN TRANSACTION 语句后面的COMMIT TRANSACTION 语句。因为 BEGIN TRANSACTION 启动一个嵌套事务,而随后的 COMMIT 语句只应用于该嵌套事务。如果在 COMMIT 之后执行 ROLLBACK TRANSACTION 语句,那么 ROLLBACK 将一直回滚到最外部的 BEGIN TRANSACTION。以下的触发器阐明了这一点:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
BEGIN TRANSACTION
INSERT INTO TrigTarget
SELECT * FROM inserted
COMMIT TRANSACTION
ROLLBACK TRANSACTION

此触发器绝对不会在 TrigTarget 表中插入。BEGIN TRANSACTION 总是启动一个嵌套事务。COMMIT TRANSACTION 只提交嵌套事务,而下面的 ROLLBACK TRANSACTION 则一直回滚到最外部的 BEGIN TRANSACTION。



摘自:SQLSEVEE帮助 F1
WorldMobile 2004-11-22
  • 打赏
  • 举报
回复
如果你在事务里写了update或者insert语句,你需要用commit进行提交,要不数据并没有真正修改

如果你用rollack,事务将回滚,修改的数据全部撤消
Andy__Huang 2004-11-22
  • 打赏
  • 举报
回复
//执行Begin Trans后,Commit Trans 和 Rollback Trans 都是终止事务的执行的。
那具体有什么区别啊??

成功提交時用Commit Trans
如果錯誤﹐就是操作不成功﹐如insert into,update,delete失敗﹐那么用Rollback Trans 回滾﹐回到原來的狀態﹐數據保持不變
WorldMobile 2004-11-22
  • 打赏
  • 举报
回复
COMMIT是提交事务
ROLLBACK是回滚事务,两者差大了

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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