事务是数据库管理系统中的一个重要概念,它具有四个特性,通常被称为ACID特性。
ACID是事务的四个基本特征,代表
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
原子性(Atomicity):原子性指的是事务是一个不可分割的操作单位,要么全部执行成功,要么全部失败回滚。事务中的所有操作要么都被执行,要么都不被执行,不能只执行其中的一部分。如果事务中的任何操作失败,系统将回滚所有已执行的操作,使数据库回到事务开始前的状态。
一致性(Consistency):一致性要求事务将数据库从一个一致状态转变为另一个一致状态。这意味着事务在执行之前和之后都必须满足数据库定义的所有约束和规则。如果事务执行成功,数据库将处于一致状态;如果事务失败或回滚,数据库仍然保持一致状态。
隔离性(Isolation):隔离性确保事务在并发执行时相互隔离,互不干扰。即使多个事务同时对同一数据进行操作,每个事务也必须像是在独立执行,不受其他事务的影响。隔离性通过使用锁定机制和并发控制技术来实现,以防止数据的不一致和冲突。
持久性(Durability):持久性指的是一旦事务提交,其结果将永久保存在数据库中,并且对系统故障具有恢复能力。即使在系统发生故障(如断电或崩溃)后,数据库也应能够将已提交的事务的结果恢复到原始状态。持久性通常通过将事务日志记录到稳定的存储介质(如磁盘)来实现。
这些ACID特性确保了数据库中事务的可靠性和一致性,使得在复杂的并发环境下多个事务能够正确地执行并维护数据库的完整性。
事务的隔离级别
隔离级别的含义:
读未提交(Read Uncommitted):允许一个事务读取到其他事务未提交的数据。事务隔离性最低,可能会出现脏读、不可重复读和幻读的问题。
读已提交(Read Committed):保证一个事务只能读取到已提交的数据,禁止脏读。但是仍可能出现不可重复读和幻读的问题。
可重复读(Repeatable Read):保证一个事务在执行期间多次读取同一数据时,读取到的结果是一致的,任然会幻读,禁止不可重复读,脏读。
串行化(Serializable):最高的隔离级别,通过对事务加锁实现完全隔离,禁止脏读、不可重复读和幻读。但是并发性能最差。
隔离级别 | 脏读(Dirty Read) | 不可重复读(Non-repeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
读已提交 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
可串行化 | 否 | 否 | 否 |
开启事务:start transaction;
提交事务:commit;
查询当前事务隔离级别:select @@transaction_isolation;
设置当前事务隔离级别:set session transaction isolation level 隔离级别
> 隔离级别
读未提交(Read Uncommitted)
读已提交(Read Committed)
可重复读(Repeatable Read)
脏读(Dirty Read):事务未提交时,一个事务读取到了另一个事务未提交的数据。
不可重复读(Non-repeatable Read):指在一个事务内,多次读取同一数据,但第二次读取数据时,另一个事务修改该数据并提交,第二次读取的数据与第一次不同。
幻读(Phantom Read):指在一个事务内,多次查询同一范围的数据,但每次查询得到的行数不一致。
- 不可重复读与幻读区别:
不可重复读关注的是在同一事务内多次读取同一数据的一致性,而幻读关注的是在同一事务内多次查询结果集的一致性。
不可重复读是由于其他事务对数据的修改或删除 引起的,而幻读是由于其他事务的插入操作引起的。