事务

什么是事务

在计算机科学中,事务(Transaction)是一个操作序列,它们作为一个整体被执行,以保证数据的完整性和一致性。如果事务中的所有操作都成功完成,那么事务将被提交,更改将被永久保存。如果事务中的任何一个操作失败,整个事务将被回滚,就像没有任何操作被执行过一样。

以下是事务的一些关键特性,通常被称为ACID四大特性

  • 原子性(Atomicity)

    事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个点。

  • 一致性(Consistency)

    事务必须保证数据库从一个一致的状态转移到另一个一致的状态。

  • 隔离性(Isolation)

    并发执行的事务之间不会互相影响。

  • 持久性(Durability)

    一旦事务提交,它对数据库的改变就是永久性的,即使系统发生故障也不会丢失。

注意:只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的。

事务的隔离级别

版本1

SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

版本2

在数据库管理系统中,事务的隔离级别是指多个事务并发执行时,数据库系统如何隔离每个事务,以保证数据的完整性和一致性。不同的隔离级别会直接影响到事务并发时可能出现的问题,如脏读、不可重复读和幻读。

以下是常见的事务隔离级别及其特点:

  • 读未提交(Read Uncommitted)

    • 特点:这是最低的隔离级别。一个事务可以读取到其他事务未提交的数据。
    • 问题:可能会出现脏读。即读取到其他事务尚未提交的修改数据,而这些数据可能会被回滚。
    • 适用场景:几乎不适用于实际业务场景,因为数据的可靠性无法保证。
  • 读已提交(Read Committed)

    • 特点:一个事务只能读取到其他事务已经提交的数据。
    • 问题:虽然避免了脏读,但可能会出现不可重复读。即在同一个事务中,多次读取同一数据时,可能会因为其他事务的提交而得到不同的结果。
    • 适用场景:适用于那些对数据一致性要求不高,但需要避免脏读的场景,例如一些简单的查询操作。
  • 可重复读(Repeatable Read)

    • 特点:在同一个事务中,多次读取同一数据时,结果是一致的。即保证了事务的可重复性。
    • 问题:可能会出现幻读。即在同一个事务中,读取到的数据范围可能会因为其他事务的插入操作而发生变化。
    • 适用场景:适用于对数据一致性要求较高的场景,例如一些复杂的查询和更新操作。
  • 可串行化(Serializable)

    • 特点:这是最高的隔离级别。事务串行执行,完全隔离。每个事务都像是在独立的数据库中运行,不会受到其他事务的影响。
    • 问题:虽然避免了所有并发问题(脏读、不可重复读和幻读),但性能开销最大,因为系统需要对事务进行严格的加锁和调度。
    • 适用场景:适用于对数据一致性要求极高,且并发量不大的场景,例如金融交易系统等。

不同数据库系统的默认隔离级别:

  • MySQL(InnoDB引擎):默认隔离级别是可重复读(Repeatable Read)。
  • SQL Server:默认隔离级别是提交读(Read Committed)。
  • PostgreSQL:默认隔离级别是可重复读(Repeatable Read)。

事务的并发问题

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致一下的问题。

  • 脏读(Dirty read): 指的是A事务读取到B事务尚未提交的数据,“脏数据”指的是未提交的数据。

  • 不可重复读(Unrepeatableread): 指的是A事务使用相同条件多次读取同一数据,得到的结果不一致。

  • 幻读(Phantom read): 指的是A事务使用相同条件多次读取某一批数据,得到的记录条数不一致。幻读与不可重复读类似,区别在于不可重复读的重点是修改,幻读的重点在于新增或者删除。

  • 丢失更改:指的是A、B事务先后更改同一数据,先修改的结果就被丢失了。

不可重复度和幻读区别:

例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。

例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读。

隔离级别与并发问题的关系

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted)
已提交读(Read committed)
可重复读(Repeatable read)
可串行化(Serializable )

常见的事务类型

参考

posted @ 2024-08-27 13:51  抒写  阅读(18)  评论(0)    收藏  举报