事务管理
事务管理
事务管理是指在数据库管理系统(DBMS)中,确保一系列操作要么完成执行,要么完全不执行的机制。事务是一组作为单一单元执行的操作,它们要么成功执行并提交(commit),要么发生错误并回滚(rollback),确保数据的完整性和一致性。
1.原子性(Atomicity)
- 事务中的所有操作要么完全执行,要么完全不执行
- 如果事务中某一部分出现失败,事务会回滚到它刚开始的状态,确保没有部分操作成功
2.一致性(Consistency)
- 事务执行前后,数据库的状态要从一个一致的状态转变到另一个一致的状态
- 事务开始时,数据库处于一个有效的状态,执行完事务后,数据库依然保持有效和一致
- 例:银行账户的余额必须大于等于0
3.隔离性(lasolation)
- 每个事务的执行应该不被其他事务干扰。事务的操作对其他事务来说是隔离的,类似于事务按顺序串行执行
4.持久性(Durability)
- 一旦事务被提交,他所作的更改将永久保存。即使发生系统崩溃,数据也不会丢失
并发可能导致事务发生的问题
在一个实际的项目开发中,事务一般伴随着高并发,多个事务可能同时进行。这就会带来一些并发问题,主要包括:
1.丢失修改:
- 两个事务同时读取同一数据并修改它,最终只有一个修改被保存,另一个修改就丢失了
2.不可重复读:
- 在同一事务中读取相同的数据两次,但结果不同,因为其他事务在此期间修改了该数据
3.脏读:
- 一个事务读取了另一个事务未提交的数据,导致读取到的数据可能是无效的或错误的。如果第二个事务回滚,脏读的数据将不再有效。
- 示例:用户A在读取余额后进行操作,而在用户A操作过程中,用户B修改了余额并提交。用户A读取到的是未提交的余额,最终可能发生错误。
并发问题的解决
1.封锁机制:
封锁机制是通过对数据进行锁定来避免多个事务同时修改同一数据。常见的封锁类型有:
- 共享锁(S锁):允许事务读取数据,但不允许修改数据,其他事务也可以读取数据
- 排他锁(X锁):允许事务读取和修改数据,其他事务不能访问该数据
一种常见的封锁协议是两段锁协议:
在事务执行的过程中,事务先获取锁(锁定阶段),然后执行操作,最后释放锁(解锁阶段)
两段锁协议确保了事务在开始时索取锁,结束时释放锁,防止事务发生死锁或不一致问题。它有两个阶段:
- 增长阶段:事务可以获取锁,但不能释放任何锁
- 收缩阶段:事务释放锁,但不能再获取任何锁
两段锁协议能保证串行化的隔离级别,避免发生问题
2.事务隔离级别:
事务隔离级别定义了事务执行时与其他事务的隔离程度。常见的隔离级别有四种,从最低到最高依次为:
读未提交:
- 事务可以读取其他事务未提交的数据,可能会出现脏读
- 这种隔离级别性能最好,但一致性最差
读已提交:
- 事务只能读取其他事务已提交的数据,避免了脏读,但可能会出现不可重复读的情况
- 比读未提交隔离级别稍强,常见的默认隔离级别
可重复读:
- 事务内的多次读取都返回相同的数据,避免了脏读和不可重复读,但可能会出现幻读的问题(即在事务读取数据时,同时插入另一新的数据)
串行化:
- 最高隔离级别,事务完全隔离,执行时效果像串行执行一样,避免了脏读、不可重复读和幻读
- 性能最差,但一致性最强
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Antifrag!




