什么是事务
事务是访问数据库的一个操作序列,是满足 ACID 特性的一组操作,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。
事务的ACID
A:原子性
原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生
B:一致性
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
这些约束可能包括主键约束、外键约束或是一些用户自定义约束。事务执行的前后都是合法的数据状态,不会违背任何的数据完整性,这就是“一致”的意思。
数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
当然这个含义中也隐含着对开发者的要求,就是不能写出错误的事务逻辑,比如银行的转账不能只加钱不减钱,这是应用层面的一致性要求
C:隔离性性
多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果
D:持久性
意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。即使系统发生崩溃,事务执行的结果也不能丢失
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。
主要有四种问题,解决难度依此提升
丢失修改
T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。
读脏数据
T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
不可重复读
T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
幻影读
T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
幻影读和不可重复读的区别
对于前者, 只需要锁住满足条件的记录
对于后者, 要锁住满足条件及其相近的记录
简单的解决方式:避免不可重复读需要锁行就行,避免幻影读则需要锁表
但不可重复读重点在于update和delete,而幻读的重点在于insert
所以说不可重复读和幻读最大的区别,就在于如何通过锁机制来解决他们产生的问题
产生并发不一致性问题主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
参考:https://blog.csdn.net/qq_39521554/article/details/80240841