数据库原理

事务

一个数据库事务通常包含对数据库进行读或写的一个操作序列。

事务有四大特性:原子性,一致性,持久性,隔离性。

事务就是由一跳或者多条SQL语句组成的,事务中的操作要么不做,要么全做。

ACID

原子性

事务的所有操作要么全部执行成功,要么全部失败回滚。要做就全做,不然不做。

回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

一致性

事务应确保数据库的状态从一个一致状态转变为另一个一致状态。在事务开始之前以及事务结束之后,数据库的完整性约束没有被破坏

隔离性

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

持久性

一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

使用重做日志来保证持久性。

事务分类

主要分为扁平事务,带保存点的扁平事务,链事务,嵌套事务,分布式事务。

扁平事务

begin work 开始,commit work或者rollback work结束。

要么都执行,要么从头开始回滚。

他的限制是无法回滚或者提交数据的一部分,一旦回滚就得回滚所有

带保存点的事务

回滚操作可以选择回滚到某一个保存点。rollback work: 2,回滚到第二个保存点。

并发事务带来的问题

多个事务并发执行,经常会发生多个事务操作相同的数据,这就会导致一定的一致性问题。

丢失修改

T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。T1再读取的时候就不是自己修改的数据了,而是T2修改之后的。

img

读脏数据

T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。

img

不可重复读

指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

img

幻影读

幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

img

不可重复读的重点是修改幻读的重点在于新增或者删除

事务隔离级别

通过事务隔离可以解决上面的问题。

读取未提交

最低的隔离级别,即使没有提交,其他事务对于该事务操作也是可见的。

可能会导致脏读、幻读或不可重复读