none
请教有关于事务原子性的问题 RRS feed

  • 问题

  • 请教大家:我写了下面有关事务的语句并执行,但却发现第一条更新的语句被执行了,事务不是具有原子性吗?照理来讲不是只要有其中语句执行不成功就回滚么,怎么第一条更新语句会被执行呢?请教大家,多谢!

    begin tran
    update Student set name='Delan' where name='戴兰'--这条语句被执行了
    insert Student(ID,name) values(23422342343,'小米')--这一句将导致ID字段数字溢出,最终出错
    commit


    清爽无比
    2010年4月2日 15:11

答案

  • 出错后语句回继续执行, 也就是commit被执行了. 你可以在代码里加入异常处理的代码,例如

    begin tran
    update Student set name='Delan' where name='戴兰'--这条语句被执行了
    insert Student(ID,name) values(23422342343,'小米')--这一句将导致ID字段数字溢出,最终出错
    if @@ERROR<>0
     rollback
    else
     commit 


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年4月2日 18:52
    版主

全部回复

  • Did you put 'rollback tran' anywhere in your code? 
    2010年4月2日 16:18
  • 出错后语句回继续执行, 也就是commit被执行了. 你可以在代码里加入异常处理的代码,例如

    begin tran
    update Student set name='Delan' where name='戴兰'--这条语句被执行了
    insert Student(ID,name) values(23422342343,'小米')--这一句将导致ID字段数字溢出,最终出错
    if @@ERROR<>0
     rollback
    else
     commit 


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年4月2日 18:52
    版主
  • 1、不是所有的錯誤都會導致rollback,一些鎖超時或者主鍵沖突,就不會引起rollback;

    2、如果顯式的定義倆一個事務的邊界,那么就要顯式的標明rollback或者commit。

    2010年4月3日 8:23