事务管理

事务管理是指在数据库管理系统(DBMS)中,确保一系列操作要么完成执行,要么完全不执行的机制。事务是一组作为单一单元执行的操作,它们要么成功执行并提交(commit),要么发生错误并回滚(rollback),确保数据的完整性和一致性。

1.原子性(Atomicity)

  • 事务中的所有操作要么完全执行,要么完全不执行
  • 如果事务中某一部分出现失败,事务会回滚到它刚开始的状态,确保没有部分操作成功

2.一致性(Consistency)

  • 事务执行前后,数据库的状态要从一个一致的状态转变到另一个一致的状态
  • 事务开始时,数据库处于一个有效的状态,执行完事务后,数据库依然保持有效和一致
  • 例:银行账户的余额必须大于等于0

3.隔离性(lasolation)

  • 每个事务的执行应该不被其他事务干扰。事务的操作对其他事务来说是隔离的,类似于事务按顺序串行执行

4.持久性(Durability)

  • 一旦事务被提交,他所作的更改将永久保存。即使发生系统崩溃,数据也不会丢失

并发可能导致事务发生的问题

在一个实际的项目开发中,事务一般伴随着高并发,多个事务可能同时进行。这就会带来一些并发问题,主要包括:

1.丢失修改:

  • 两个事务同时读取同一数据并修改它,最终只有一个修改被保存,另一个修改就丢失了

2.不可重复读:

  • 在同一事务中读取相同的数据两次,但结果不同,因为其他事务在此期间修改了该数据

3.脏读:

  • 一个事务读取了另一个事务未提交的数据,导致读取到的数据可能是无效的或错误的。如果第二个事务回滚,脏读的数据将不再有效。
  • 示例:用户A在读取余额后进行操作,而在用户A操作过程中,用户B修改了余额并提交。用户A读取到的是未提交的余额,最终可能发生错误。

并发问题的解决

1.封锁机制:

封锁机制是通过对数据进行锁定来避免多个事务同时修改同一数据。常见的封锁类型有:

  • 共享锁(S锁):允许事务读取数据,但不允许修改数据,其他事务也可以读取数据
  • 排他锁(X锁):允许事务读取和修改数据,其他事务不能访问该数据

一种常见的封锁协议是两段锁协议

  • 在事务执行的过程中,事务先获取锁(锁定阶段),然后执行操作,最后释放锁(解锁阶段)

  • 两段锁协议确保了事务在开始时索取锁,结束时释放锁,防止事务发生死锁或不一致问题。它有两个阶段:

    1. 增长阶段:事务可以获取锁,但不能释放任何锁
    2. 收缩阶段:事务释放锁,但不能再获取任何锁

    两段锁协议能保证串行化的隔离级别,避免发生问题

2.事务隔离级别:

事务隔离级别定义了事务执行时与其他事务的隔离程度。常见的隔离级别有四种,从最低到最高依次为:

  • 读未提交

    • 事务可以读取其他事务未提交的数据,可能会出现脏读
    • 这种隔离级别性能最好,但一致性最差
  • 读已提交

    • 事务只能读取其他事务已提交的数据,避免了脏读,但可能会出现不可重复读的情况
    • 比读未提交隔离级别稍强,常见的默认隔离级别
  • 可重复读

    • 事务内的多次读取都返回相同的数据,避免了脏读和不可重复读,但可能会出现幻读的问题(即在事务读取数据时,同时插入另一新的数据)
  • 串行化

    • 最高隔离级别,事务完全隔离,执行时效果像串行执行一样,避免了脏读、不可重复读和幻读
    • 性能最差,但一致性最强