什么是事务?
一系列数据库操作组成的一个完整的、不可拆分的逻辑过程,该过程被称为一个事务,具有ACID特性
什么是ACID特性
Atomicity(原子性)
事务(transaction)中的所有操作,要么都完成,要么都不完成,不会结束于中间环节。若事务在执行过程中发生错误,则数据会被回滚(Rollback)至事务开始前的状态,就像事务从未执行过
Consistency(一致性)
事务开始之前与事务结束之后,数据库的完整性未被破坏,即写入的数据必须完全符合所有的预设规则
Isolation(隔离性)
数据库允许事务并发地对数据进行读取与修改,而隔离性可防止由事务并发执行带来的数据可见性问题。事务隔离分为不同级别:读取未提交(Read Uncommitted)、读取已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)
Durability(持久性)
事务结束之后,对数据的修改是永久性的,即使系统故障也不会丢失
事务隔离级别
并发事务带来的问题:
- 脏读(Dirty Mead): 事务A正在对数据进行修改,尚未修改完成时事务B对数据进行读取,则事务B读取到的是 "脏数据" ,称为脏读
- 修改丢失(Lost To Modify): 事务A与事务B同时对一个数据进行修改,先完成的事务的修改会丢失。示例:data == 1,事务A执行data++,事务B执行data--,事务A先于事务B完成,此时事务A的修改会丢失,data == 0,称为修改丢失
- 不可重复读(Unrepeatableread): 事务A多次读取同一数据,但在事务A尚未完成时,事务B对数据进行了修改,导致事务A重复读取的数据不一致,称为不可重复读
- 幻读(Phantom Read): 事务A多次读取同一范围内的数据,但在事务A尚未完成时,事务B向该范围中添加了数据,导致事务A在后续读取中读取出先前不存在的数据,称为幻读
不可重复读与幻读相似,区别在于数据的值与数据的量
事务隔离级别(级别由低到高):
- READ-UNCOMMITTED(读取未提交): 允许读取并发事务尚未提交修改的数据,可能会导致脏读、幻读与不可重复读
- READ-COMMITTED(读取已提交): 允许读取并发事务已提交修改的数据,可阻止脏读,但不可重复读与幻读仍有可能发生
- REPEATABLE-READ(可重复读): 对同一数据的重复读取结果一致,除非数据为事务本身所修改,可阻止脏读与不可重复读,但幻读仍有可能发生
- SERIALIZABLE(可串行化): 完全遵守ACID的隔离级别,所有的事务依次提交,事务之间不可能产生干扰,该级别可防止脏读、不可重复读以及幻读。
博客介绍了数据库事务,它是一系列不可拆分的操作,具有ACID特性,包括原子性、一致性、隔离性和持久性。还阐述了并发事务带来的问题,如脏读、修改丢失等,以及不同的事务隔离级别,如读取未提交、读取已提交等,各有不同的防错能力。

2万+

被折叠的 条评论
为什么被折叠?



