事务
事务既是同批操作要么都成功,要么都失败,事务的本质就是为了保证操作业务的正确性。
事务特性
特性 | 含义 |
---|---|
原子性(Atomicity) | 所有的sql操作是一个整体,不可再分割。事务应该是最小的执行单元 |
一致性(Consistency) | 事务执行前后。数据的状态一致 |
隔离性(Isolation) | 事务是可以并发执行的,理想的情况应该是所有的事务之间不能相互影响 |
持久性(Durability) | 如果事务对数据库进行了操作,事务一旦成功或者失败,对数据库中的数据影响是持久的 |
事务的SQL语句
功能 | SQL语句 |
---|---|
开启事务 | start transaction |
提交事务 | commit |
回滚事务 | rollback |
设置回滚点 | savepoint variableName |
回到回滚点 | rollback to variableName |
在mysql中默认自动开启事务,也默认自动提交事务
语句 | 含义 |
---|---|
select @@autocommit | 查询当前事务状态 |
set @@autocommit = 1 | 设置事务自动提交 |
set @@autocommit = 0 | 设置事务手动提交 |
事务执行原理
- 一个用户登录成功以后,服务器会创建一个临时日志文件。日志文件用来保存用户事务状态。
- 如果没有使用事务,则所有的操作直接写到数据库中,不会使用日志文件。
- 如果开启事务,将所有的写操作写到日志文件中。
- 如果这时用户提交了事务,则将日志文件中所有的操作写到数据库中。
- 如果用户回滚事务,则日志文件会被清空,不会影响到数据库的操作。
事务的隔离级别
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|---|
1 | 读未提交 | read uncommitted | √ | √ | √ |
2 | 读已提交 | read committed | × | √ | √ |
3 | 可重复读 | repeatable read | × | × | √ |
4 | 串行化 | serializable | × | × | × |
-- 查看mysql数据库事务隔离级别
show variables like '%isolation%';
-- 隔离级别设置成: 读未提交 出现脏读(读取到其它事务未提交的数据)
set global transaction isolation level read uncommitted;
-- 隔离级别设置成: 读已提交 出现不可重复读(多次读取到的数据不一样,会出现读取到别人已提交的数据)
set global transaction isolation level read committed;
-- 隔离级别设置成: 可重复读 出现幻读(一次事务多次读取到的数据是一样的)
set global transaction isolation level repeatable read;
-- 隔离级别设置成: 可串行化
set global transaction isolation level serializable;