欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

MYSQL 数据库事务再认识

程序员文章站 2022-03-22 16:50:08
...
事务的概念:单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。简单理解就是每执行一次数据操作都是在事务这个逻辑工作单元中执行的。

事务的四个属性: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)!