6
回答
请问数据库事务不提交或提交失败需要回滚吗?
终于搞明白,存储TCO原来是这样算的>>>   

请问在同一个事务中,如果我没有提交事务(因为我已经捕获到异常了)这个时候需要回滚操作吗?我看到很多代码上都做了回滚,但是此时我连事务都没提交,都没真正与数据库发生交互,回滚什么呢?

还有如果我在提交事务的过程中出现异常,这时需要回滚吗?如果出现异常那么事务提交失败,这个时候应该也没有真正影响到数据库,是不是也不需要回滚?那么回滚真正是在什么地方用呢?

举报
Atlantis
发帖于4年前 6回/4K+阅
共有6个答案 最后回答: 1年前

1.不提交只有两种情况:

客户端进程终止,数据库主动回滚;

执行代码的进程一直等待,这会阻塞其他修改该数据的会话


2.提交失败

只有一种情况吧: 数据库报错,这时数据库给客户端说数据库出问题了,问题修复后应该会主动回滚


综上,无论因为网络中断还是db服务器问题(磁盘、电源...),都会主动回滚,否则产生阻塞

我说你在开玩笑吧。没有提交事务并不代表你对数据库的改变不存在,如果是脏读的隔离层级你修改数据到提交完成前的变更其他访问者也是可以看到的。只有你提交后这部分修改才确认不会变更而已,哪怕设定了其他隔离级别也可以看到了。

如果你不回滚,那么线程就停在哪里搁着?制造出数据库死链放着不管直到数据库认为这个连接超时自动断开并自动回滚?

有异常并不一定,操作没有执行 。比如 删某行数据 ,在某些情况下会有些异常 。但数据是真的删了 ,如果不会滚 ,坐等悲剧 。

如果有多条sql 在一个 事务 区间 , 第一条 执行了 ,第二条 执行 异常 ,第三条等待 执行 , 如果不会滚 坑定有问题 。

引用来自“魔力猫”的评论

我说你在开玩笑吧。没有提交事务并不代表你对数据库的改变不存在,如果是脏读的隔离层级你修改数据到提交完成前的变更其他访问者也是可以看到的。只有你提交后这部分修改才确认不会变更而已,哪怕设定了其他隔离级别也可以看到了。

如果你不回滚,那么线程就停在哪里搁着?制造出数据库死链放着不管直到数据库认为这个连接超时自动断开并自动回滚?

连接超时自动断开并自动回滚”数据库有此机制?以 oracle或Mysql为例,这里的超时是什么参数?
顶部