事务作为一个抽象层,使得应用程序可以忽略数据库内部一些复杂的并发问题,以及某些硬件、软件故障,从而简化应用层的处理逻辑,大量的错误可以转化为简单的事务终止和应用层重试
如果没有事务,各种错误情况(如进程崩溃、网络中断、停电、磁盘已满、并发竞争等)会导致数据可能出现各种不一致。例如,反规格化数据模式和相关操作回导致与源数据不同步。假设没有事务,处理那些复杂交互访问最后所导致的数据库混乱就会异常痛苦
- 脏读:客户都安读到了其他客户都安尚未提交的写入。用读-提交隔离级别
- 脏写:客户端覆盖了另一个客户端尚未提交的写入
- 读倾斜(不可重复读):客户在不同的时间点看到了不同值。快照隔离是最常用的防范手段,即事务总是在某个时间点的一致性快照中读取数据。通常采用多版本并发控制(MVCC)来实现快照隔离
- 更新丢失:两个客户端同时执行读-修改-写入操作序列,出现了其中一个覆盖了另一个的写入,但又没有包含对方最新值的情况,最终导致了部分修改数据发生了丢失。**快照隔离的一些是西安可以自动防止这种异常,而另一些则需要手动锁定查询结果(SELECT FOR UPDATE)
- 写倾斜:事务首先查询数据,根据返回的结果而作出某些决定,然后修改数据库。当事务提交时,支持决定的前提条件已经不再成立。只有可串行化的隔离才能防止这种异常
- 幻读:事务读取了某些符合查询条件的对象,同时另一个客户端执行写入,改变了之前的查询结果(结果个数多了or少了)。快照隔离可以防止简单的幻读,但写倾斜的情况则需要特殊处理,例如采用区间范围锁
实现可串行化隔离的三种不同的方法
- 严格串行执行事务
- 两阶段枷锁
- 可串行化的快照隔离(SSI)-最新