关系型数据库都要满足ACID,而这里的原子性和一致性尤为关键。一般来说事务是保障这些的有力条件。事务要么成功要么失败。即commit或者rollback。
很多年前学习数据库的时候,知道了一个事务在执行完毕后,应该执行commit,如果没有执行commit但是后面执行了一个create table这样的DDL语句那么数据库会在create之前强制执行一个commit。这种叫做隐式提交。而我们一般的commit是显示提交。
但是这个机制在某些场景上不同数据库是不一样的。
这是一个MySQL数据库,有4条数据。
在开始事务以后,写入一条数据。并且提交了。那么就有5条数据。这和预期一样。
然而,在写入一条数据以后。执行了一个退出。即事务没有完成。那么这条数据在使用者角度中认为这是没提交。最终没有查到id为6的数据,符合预期。
那么在Oracle数据库上。由于Oracle是没有自动提交,所以每个增删改都是默认开启事务的。在下图中显示提交一条数据,最终查询到一条数据。符合预期。
然而下面一个场景,可能就和大家预期有点不一样。因为在insert之后没有提交,而是执行了退出。可能按照常理来说,属于rollback。但是结果和预期不一样。退出会话(或者说事务)的时候,看样子是执行了隐式提交。
所以最终的结果是2条。
不同数据库的隐式提交的定义或者范围是不一样的。这个可能不是按照我们想象的那样。