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

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;提示
我们一般会采用数据库默认的事务隔离级别,不会去修改
