https://www.cnblogs.com/wyaokai/p/10921323.html
一、事务概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
二、事务四大特性(ACID)
1、原子性(Atomicity)
原子性指事务包含的操作要么全部成功,要么全部失败回滚,因此事物的操作如果成功就必须应用到数据库,如果失败则不能对数据库有任何影响
2、一致性(Consistency)
一致性指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也 就是说事务执行前和执行后必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
3、隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,数据库为每个用户开启一个事务,
不能被其他事务操作干扰,多个并发事务之间要隔离。
4、持久性(Durability)
持久性是指一个事物一旦被提交,那么对数据库的改变是永久性的,即使数据库系统遇到故障情况下也不会丢失提交事务的操作。
三、事务的隔离级别
1、读未提交
一个事务可以读取到另一个未提交事务的数据,会发生脏读
2、读提交
一个事务要等另一个事务提交后才能读数据,解决脏读
3、重复读
在开始读取数据(事务开启)时,不能允许修改操作。不可重复读对应的是修改(update操作),会有幻读问题(幻读对应insert操作)
4、序列化
最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读 不可重复读与幻读。但这种事务隔离级别效率底下,比较耗数据库性能,一般不使用。
四、四种隔离级别可能导致的问题
1、Read Uncommitted(未提交读) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
2、READ COMMITTED (提交读):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。
3、REPEATABLE READ(重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。
4、Serializable (串行化):最严格的级别,事务串行执行,资源消耗最大。
通俗解释:
脏读:读到了别的事务回滚前的脏数据,比如事务b执行过程中修改了x,在未提交前,事务a读取到了x,而事务b却回滚了,事务a形成了脏读。即:当前事务读到数据是别的事务想要修改的但是没有修改成功的数据。
不可重复读:事务a首先读取一条数据,然后执行逻辑时,事务b将该数据修改,事务a再次读取时,发现数据不匹配了,就是不可重复读。即:当前事务先进行一次数据读取,然后再次读到的是别的事务修改成功的数据,导致两次读取到的数据不匹配。
幻读:事务a首先根据条件索引得到n条数据,然后事务b改变了这n条数据之外的m条符合事务a搜索条件的数据,导致事务a再次搜索时发现有(n+m/n-m)条数据,产生幻读。即:当前事务读第一次取到的数据比后来读取到的数据条目不一致。