1.什么是事务
通俗易懂的就是说,在我们执行一个事务期间,对数据库进行了好几步的操作,执行了多条命令,该事务结束后,这些命令要么全部都执行成功,要么全部都执行失败,不存在其他结果。
2.事务的特性
原子性:一个事务本身就原子的,也就是说事务中的操作要么全部完成,要么全部失败。 一致性:执行事务前后,数据保持一致。比如转账业务中,无论转账成功或者失败,收款方和付款方的总额是不变的。 隔离性:并发访问数据库时,多个事务之间的操作应该是是互不影响的。 持久性:一个事务提交后,对数据库中数据的改变是永久的。
3.事务的隔离级别
以下四个隔离级别递增:
读未提交:一个事务可以读其他未提交的事务中的数据。 读已提交:一个事务只可以读其他已经提交了的事务的数据,如果其他事务未提交,那么不能读这些事务中的数据。 可重复读:一个事务在它启动阶段读到的某个数据一直到该事务结束时读到的该数据都一样。 串行化:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰。
可以通过下图来更好的理解(图片源自:极客时间 林晓斌):
情景如下:假设一个表中只有一个数据为1,事务A和事务B并发操作该表。 首先事务A和事务B同时启动事务,事务A先查询数据得到1,接着事务B也查询该数据得到1后将其修改为2,紧接着事务A又一次查询了该数据,我们假设为V1;然后事务B提交,事务A第二次次查询该数据得到V2,接着事务A提交,提交之后第三次查询该数据得到V3。 看一下不同隔离级别下的V1、V2、V3都是多少(图中从上往下为操作的时间顺序)。
若隔离级别为“读未提交”:此隔离级别下事务A可以读取事务B未提交的数据,V1就是在事务B未提交时读取的,所以V1是2,那么V2和V3也是2。 若隔离级别为“读已提交”:此隔离级别下事务A不能读取事务B未提交的数据,因此V1还是1,V2是事务A在事务B提交后才读取的,因此V2是2,V3也是2。 若隔离级别为“可重复读”:此隔离级别下,事务A在它的整个事务中读取的数据都一样,因此V1和V2相同,都是1,V3是2。 若隔离级别为串行化:则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。所以从 A 的角度看, V1、V2 值是 1,V3 的值是 2。
|