主题
事务基础
简介
事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败。
事务的应用举例:
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;
提示
我们一般会采用数据库默认的事务隔离级别,不会去修改