事务

一组操作的集合,不可分割的工作单位,它会将所有的操作作为一个整体,一起向系统发出请求,这些操作要么同时成功,要么同时失败。

事务抛出异常时,需要回滚,即把以前操作全部撤销,将数据恢复为原来的样子。

以简单的转账操作为例:

首先确定a的余额,满足条件则余额减少,再将b的余额增加对应的额度。

事务操作

方式一

//查看/设置事务提交方式
SELECT @@autocommit; //此时为自动提交
SET @@autocommit=0;  //在上面那句之后再运行这句,会变成手动提交

//提交事务
COMMIT;

//回滚事务
ROLLBACK;

当事务内所有的操作全部正常执行完毕后,会根据设定的提交方式来决定是否在当下就修改数据。

当提交方式为自动时,一旦所有操作执行完,数据就会被修改。提交方式为手动时,需要再运行“COMMIT;”指令来修改数据。

提交前,任何指令对数据的修改都是暂时的,只有在执行操作后运行提交指令才会对数据进行改动。

在操作产生异常后,不要选择提交,而是进行回滚,恢复原有状态。

方式二

//开启事务
START TRANSACTION 或 BEGIN;

//提交事务
COMMIT;

//回滚事务
ROLLBACK;

在运行时,开启事务语句和事务操作可以同时执行,再根据是否异常选择提交或回滚。

事务的四大特性

  1. 原子性 Atomicity:事务是不可分割的最小操作单元
  2. 一致性 Consistency:事务完成时,必须使所有数据都保持一致状态。
  3. 隔离性 Isolation:数据库系统提供隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  4. 持久性 Durability:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

并发事务问题

  1. 脏读:一个事务读取到另外一个事务尚未提交的数据(更新了但是还没提交)
  2. 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同(被另一个并发的事务修改了)
  3. 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是插入数据时,又发现这行数据已经存在(A发现没有这条数据后打算插入,插入前B也对这条数据进行了插入,当A插入时系统报错)

事务隔离级别

屏幕截图 2025-11-09 181302

数据库不同,默认隔离级别也不同,如Oracle的默认隔离级别是Read commited。

表中的含义是,当隔离级别为xx时,后面的事务问题是否会出现。

从上到下隔离级别越来越高,安全性越来越高,性能越来越低。

//查看隔离级别
SELECT @@TRANSACTION_ISOLATION;

//设置隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE COMMITTED | SERIALIZABLE};

解决不可重复读的体现:当进程A在一次事务中进行多次查询时,无论此时进程B在事务中对该数据是否修改、提交,A查询到的结果都只有一个。


解决幻读:在A进行事务内操作时,B的插入操作无法进行,只有当A提交完毕后,B才可以进行插入。

且只要进程B插入的数据会落入A查询过的范围,就必须等A提交,如果B插入的数据不在A查询过的范围内,则可以提交。

因此,不是全表都被锁住,而是“A查询过的范围”被锁住


对于进程‘A'、'B'的判定,是按事务开始的时间顺序来判断的。

也就是说,谁先BEGIN,谁先拿锁,后开始的事务只有等前面的释放锁以后才能执行相关操作。

Posted on 2025-11-09 20:14  miloandmicah  阅读(3)  评论(0)    收藏  举报