事务的概念

事务是一组数据库操作的执行单位,事务中的操作要么全部成功执行,要么全部失败回滚。事务可以确保数据库的一致性和完整性。在关系型数据库中,事务一般由开发者显示地开始和结束。

事务通常具有以下四个特性:原子性、一致性、隔离性和持久性。

事务的四大特性

1. 原子性(Atomicity)

原子性指事务中的所有操作要么全部成功执行,要么全部失败回滚,不允许只执行其中一部分操作。原子性可以保证数据库的一致性,即使发生意外或错误,也可以回滚到事务开始之前的状态,保持数据的完整性。

2. 一致性(Consistency)

一致性指事务执行前后,数据库从一个一致状态转换到另一个一致状态。事务在执行过程中对数据的修改必须满足事先定义的约束,如唯一性约束、外键约束等。如果有任何违反约束的操作,事务会回滚到事务开始之前的状态。

3. 隔离性(Isolation)

隔离性指多个并发执行的事务之间是相互隔离的,每个事务都不能看到其他事务的中间结果。每个事务都像是在系统中独立地执行,这样可以避免并发事务之间的干扰和数据的不一致。

4. 持久性(Durability)

持久性指一旦事务提交成功,所做的修改将永久保存在数据库中,即使系统崩溃或重启也不会丢失。数据库系统通过将事务的日志记录到磁盘来实现持久性。

事务的隔离级别

事务的隔离级别定义了一个事务中的修改对其他事务的可见性程度。常见的隔离级别有四个:读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

1. 读未提交(Read Uncommitted)

最低级别的隔离级别,事务可以看到其他事务未提交的数据变动。这个级别会导致脏读(Dirty Read)的问题,即一个事务读取到了其他事务未提交的数据,可能会造成数据不一致。

2. 读提交(Read Committed)

这个级别要求一个事务只能读取到其他事务已提交的数据。但是在同一个事务内部,多次读取同一个数据可能会得到不一致的结果,因为其他事务可能在读取过程中对数据进行了修改。

3. 可重复读(Repeatable Read)

这个级别保证同一个事务多次读取同一个数据时,得到的结果是一致的。其他事务的修改只有在当前事务结束后才会对当前事务可见。但是可能出现幻读(Phantom Read)的问题,即同一个查询在同一个事务中执行多次,但返回的结果不同。

4. 串行化(Serializable)

最高级别的隔离级别,要求事务串行执行,完全避免了并发问题。事务之间彼此完全隔离,但是会带来严重的性能损失。