数据库事务

xiaosiqi 19 2025-03-17

什么是事务

  • 一组业务当成一个业务来做,要么全部成功,要么全部失败

事务特性 ACID

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

  • 原子性(atomicity)

    • 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响

  • 一致性(consistency)

    • 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态

    • 拿转账来说,假设张三和李四两者的钱加起来一共是2000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是2000,这就是事务的一致性

  • 隔离性(isolcation)

    • 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

  • 持久性(durability)

    • 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

事务的隔离级别

隔离级别的概念

  • 多个客户端操作时 ,各个客户端的事务之间应该是隔离的,相互独立的 , 不受影响的,而如果多个事务操作同一批数据时,则需要设置不同的隔离级别 。

  • 查询和修改数据库隔离级别

-- 标准语法
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;

-- 修改数据库隔离级别为read uncommitted
SET GLOBAL TRANSACTION ISOLATION LEVEL read uncommitted;

-- 查看隔离级别
SELECT @@TX_ISOLATION;   -- 修改后需要断开连接重新开

四种隔离级别

隔离级别

英文

会引发的问题

读未提交

read uncommitted

脏读,不可重复读,幻读

读已提交

read committed

不可重复读,幻读

Oracle / SQL Server默认的隔离级别

可重复读

repeatable read

幻读

MySQL默认隔离级别

串行化

serializable

未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 读已提交(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读) 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

问题的解释

问题

现象

脏读

是指在一个事务处理过程中读取了另一个事务未提交的数据,导致两次查询结果不一致

不可重复读

是指在一个事务中读取了另一个事务中修改并已提交的数据,导致两次查询结果不一致

幻读

select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入。或不存在执行delete删除,却发现删除成功