Skip to content

事务基础

简介

事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败

事务的应用举例:

TIP

默认 Mysql 的事务是自动提交的,也就是说,当执行一条 DML 语句时候,Mysql 会立即隐式的提交事务。

事务一旦提交后,可以理解为数据就落库了

事务操作

- 方式一:更改 mysql 的事务提交方式为手动提交

  • 查看/设置 事务提交方式
sql
select @@autocommit;  -- 查询当前会话中mysql的事务提交方式

-- 1: 自动提交(默认) 0:手动提交
set @@autocommit = 0; -- 更改提交方式
  • 提交事务
sql
commit;
  • 回滚失去
sql
rollback;

TIP

@@autocommit 是会话级别的(比如 navicat 里面的一个窗口),默认值为1(自动提交事务)

当改为 0(手动提交事务)后,在当前会话中的所有对数据的操作(DML)都需要提交commit来手动提交失事务才会提交到数据库

当在执行commit前,可以执行rollback指令来回滚事务(一般在执行出错时候执行这个指令),就能保证数据库数据的一致性

- 方式二:通过显示开启事务的方式

  • 开启事务
sql
start transaction;
-- 或者
begin;
  • 提交事务
sql
commit;
  • 回滚事务
sql
rollback;

TIP

执行了start transaction;就表示我们要手动控制事务;之后只要不commit数据库的数据就不会真正的发生变化,过程中若是出现了程序异常,则要执行rollback对事务进行回滚,保证数据的一致性, 回滚就代表当前事务已经结束了

事务的四大特性(ACID)

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

并发事务问题

指的是 A 事务和 B 事务在同时操作同一个数据库甚至同一张表时候引发的问题,具体为:

问题描述
脏读一个事务读到另一个事务还没提交的数据
不可重复读一个事务先后读取同一条记录,但是两次读取到的数据不同(两次读取之间被另一个事务提交了数据),称之为不可重复读
幻读一个事务按照条件查询数据时,没有对于的数据行,但是在插入数据时又发现数据已存在,好像出现了“幻影”

事务隔离级别

TIP

事务的隔离级别就是用来解决并发事务问题的

隔离级别是否会出现
脏读
是否会出现
不可重复读
是否会出现
幻读
Read uncommitted
读 未提交
Read committed(orical 默认)
读 已提交
×
Repeatable Read(mysql 默认)
可重复读
××
Serializable
串行化
×××

提示

隔离级别从上往下,数据的安全性越来越高,但越往下性能越来越差,因此在业务中需要根据实际业务,既要权衡数据的的安全性,又要权衡数据库事务的并发性能,选择合适的隔离级别

- 查看/设置事务隔离级别

sql
--  查看事务隔离级别
select @@transaction_isolation;

-- 设置事务隔离级别
-- [session|global] 表示可选参数  {...}表示选其中一个
-- session为会话级别  global为所有会话生效
set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read | Serializable}

-- 示例
set global trasnion isolation level Read committed;

提示

我们一般会采用数据库默认的事务隔离级别,不会去修改