MYSQL 数据库事务再认识
事务的四个属性:ACID。
A:atomic,原子性。原子性强调的是不可分割,将执行数据库的过程抽象为实体对象,那这个对象要么存在要么不存在,执行时,要么整个过程执行完毕,要么不执行。
这样的优势,保证数据的完整性,正确性,最真实的实例就是同一张银行卡在转账的过程中突然断点,事务无法执行完毕,回滚后保证数据在原有的状态,这样自己卡内余额不会减少。
C:Consistent,一致性。一致性和原子性的理解基本是一致的,都是为了保证数据的完整性,例如,一个事务是由增删改查4种操作组成,只有四个操作都执行成功的情况下,才能保持成功的状态,只要有一个操作执行不成功就是失败状态,保证状态的统一。
I:Insulation,隔离性。隔离性针对并发事务存在的,任何事务之间相互隔离,互不影响。高隔离性情况下,一个事务访问另一个事务要么是访问该事务执行之前的状态,要么是执行完成之后的状态,不会访问第一个事务执行之间的状态,但这样导致数据的并发性降低,所有在设计数据库的时候要根据实际要求,权衡事务的隔离级别。
事务的隔离性由浅入深可以分为:READ UNCOMMITTED(未提交读)---READ COMMITTED(提交读)---REPEATABLE READ(可重复读)---SERIALIZABLE(序列化)
(1)SERIALIZABLE(序列化)
添加范围锁(比如表锁,页锁等,关于range lock,我也没有很深入的研究),直到transaction A结束。以此阻止其它trasaction B对此范围内的insert,update等操作。
幻读,脏读,不可重复读等问题都不会发生。
(2)REPEATABLE READ(可重复读)
对于读出的记录,添加共享锁直到transaction A结束。其它transaction B对这个记录的试图修改会一直等待直到trasaction A结束。
可能发生的问题:当执行一个范围查询时,可能会发生幻读。
(3)READ COMMITTED(提交读)
在trasaction A中读取数据时对记录添加共享锁,但读取结束立即释放。其它transaction B对这个记录的试图修改会一直等待直到A中的读取过程结束,而不需要整个trasaction A的结束。所以,在trasaction A的不同阶段对同一记录的读取结果可能是不同的。、
可能发生的问题:不可重复读。
(4)READ UNCOMMITTED(未提交读)
不添加共享锁。所以其它trasaction B可以在trasaction A对记录的读取过程中修改同一记录,可能会导致A读取的数据是一个被破坏的或者说不完整不正确的数据。
另外,在trasaction A中可以读取到trasaction B(未提交)中修改的数据。比如trasaction B对R记录修改了,但未提交。此时,在Trasaction A中读取R记录,读出的是被B修改过的数据。
可能发生的问题:脏读。
D:Duration,持久性。事务执行完成后,对数据的影响是持久存在的,即使在这之后系统出现致命故障。
以上就是MYSQL 数据库事务再认识 的内容,更多相关内容请关注PHP中文网(www.php.cn)!