MySQL事务操作
1.手动提交事务
执行成功的情况: 开启事务 -> 执行多条 SQL 语句 -> 提交事务
执行失败的情况: 开启事务 -> 执行多条 SQL 语句 -> 回滚事务
| 指令 | 说明 |
|---|---|
| start transaction;/begin; | 开启事务 |
| commit; | 提交事务 |
| rollback; | 回滚事务 |
2.自动提交事务
MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句 执行完毕 自动提交事务
MySQL默认是自动提交事务
查看当前事务是否开启
show variables like 'autocommit';
- 关闭自动开启事务
SET @@autocommit=off;
事务的特性
- 原子性:事务中所有的语句要么都执行成功,要么都失败
- 一致性:事务在执行前数据库的状态与执行后数据库的状态保持一致
- 隔离性:事务与事务之间不应该相互影响,执行时保持隔离的状态
- 持久性:一旦事务执行成功,对数据库的修改是持久的
MySQL事务隔离级别
1.并发问题
- 脏读:一个事务读取到了另一个事务中尚未提交的数据
- 不可重复读:一个事务中两次读取的数据内容不一致
- 幻读:一个事务所获得的数据不准确,无法支撑后续操作
2.四种隔离级别
| 修饰符 | 名称 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 默认隔离级别 |
|---|---|---|---|---|---|---|
| 1 | 读未提交 | read uncommitted | ||||
| 2 | 读已提交 | read committed | Oracle和SQLServer | |||
| 3 | 可重复读 | repeatable read | MySQL | |||
| 4 | 串行化 | serializable |
3.相关命令
- 设置当前隔离级别
/*set global transaction isolation level 级别名称;read uncommitted 读未提交read committed 读已提交repeatable read 可重复读serializable 串行化*/set global transaction isolation level read uncommitted;
- MySQL5.7:查看当前隔离级别
select @@tx_isolation;
- MySQL8.0+:查看当前会话隔离级别
select @@transaction_isolation;
- MySQL8.0+:查看系统当前隔离级别
select @@global.transaction_isolation;
更新时间:{docsify-updated}
