数据库四大特性ACID
Atomicity (原子性) :事务(transaction)是由指逻辑上对数据的的一组操作,这组操作要么一次全部成功,如果这组操作全部失败,是不可分割的一个工作单位。
Consistency(一致性) :在事务开始以前,被操作的数据的完整性处于一致性的状态,事务结束后,被操作的数据的完整性也必须处于一致性状态。
Isolation(隔离性) :事务隔离性要求系统必须保证事务不受其他并发执行的事务的影响
Durability(持久性): 一个事务一旦成功提交,它对数据库的改变必须是永久的,即便是数据库发生故障也应该不会对其产生任何影响。
并发事务中可能产生的问题
脏读
两个事务并发执行,一个事务处理过程中读取了另一个未提交的事务中的数据
不可重复读
两个事务并发执行,一个事务范围内多次查询返回了不同的数据值,由于在查询间隔,被另一个事务修改并提交了数据。不可重复读和脏读的区别是:脏读是某一事务事务范围内,在该事务的某次查询中读取了另一事务未提交的脏数据,而不可重复读是某一事务范围内,该事务第二次读取数据,另一事务改变并提交了数据,导致该事务第二次读取的数据不同于第一次读取的数据。
虚读(幻读)
两个事务并发执行,一个事务对符合某一特征的一批数据进行修改,另一事务此时插入了一条新的符合特征的数据,当进行修改的事务完成后再查看数据会发现有一条数据没有被修改,此为幻读。
幻读和不可重复读都是读取了另一个已提交的事务(与脏读不同),不同的是不可重复读查询的是同一个数据项,而幻读针对的是一批数据整体。
mysql四个隔离级别
Read uncommitted (读未提交)
一个事务可以读取另一个事务未提交的数据,会导致脏读的发生。
Read committed (读已提交)
若有事务对数据对数据进行更新操作,读操作要等待更新事务提交后才能读取数据,可以解决脏读,无法解决不可重复读。
Repeatable read (可重复读)
某一事务在进行读操作时,不允许其他事务进行修改操作。此时不允许修改操作,但是可能会有插入操作,即可能会有幻读的情况。
Serializable(序列化)
最高的事务隔离级别,在该级别下事务串行化执行,有效避免脏读,不可重复读,幻读,但是对数据库性能影响比较大。