容易忽视的隐式提交(不同数据库)

     关系型数据库都要满足ACID,而这里的原子性和一致性尤为关键。一般来说事务是保障这些的有力条件。事务要么成功要么失败。即commit或者rollback。

     很多年前学习数据库的时候,知道了一个事务在执行完毕后,应该执行commit,如果没有执行commit但是后面执行了一个create table这样的DDL语句那么数据库会在create之前强制执行一个commit。这种叫做隐式提交。而我们一般的commit是显示提交。

     但是这个机制在某些场景上不同数据库是不一样的。

     这是一个MySQL数据库,有4条数据。

在开始事务以后,写入一条数据。并且提交了。那么就有5条数据。这和预期一样。

然而,在写入一条数据以后。执行了一个退出。即事务没有完成。那么这条数据在使用者角度中认为这是没提交。最终没有查到id为6的数据,符合预期。

那么在Oracle数据库上。由于Oracle是没有自动提交,所以每个增删改都是默认开启事务的。在下图中显示提交一条数据,最终查询到一条数据。符合预期。

然而下面一个场景,可能就和大家预期有点不一样。因为在insert之后没有提交,而是执行了退出。可能按照常理来说,属于rollback。但是结果和预期不一样。退出会话(或者说事务)的时候,看样子是执行了隐式提交。

所以最终的结果是2条。

不同数据库的隐式提交的定义或者范围是不一样的。这个可能不是按照我们想象的那样。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值