ITPub博客

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

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

原创 Oracle 作者:xuexiaogang 时间:2023-07-06 21:01:05 0 删除 编辑

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

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

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

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


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


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


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


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


所以最终的结果是2条。

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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/637517/viewspace-2962834/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
OracleACE/PostgreSQLACE/阿里云MVP/腾讯云TVP/墨天轮 MVP/TiDBMVA/数盟会华东区长老/OpenTenBase社区委和技术委委员/架构师技术同盟名人堂成员上海地区理事会成员/if社区联合发起人/《DBA实战手记》作者/公众号:四海内皆兄弟

注册时间:2013-07-01

  • 博文量
    422
  • 访问量
    953363