事务
什么是事务?
事务,就是把一堆事情绑在一起做,都成功了才算完成,否则就恢复之前的样子
事务的属性
1.原子性:一个事务中所有的DML语句要么都成功、要么都失败,也就是说这些DML语句不能出现部分成功、部分失败的情况:这些DML不能分割
start transaction;
DML…;
commit;
事务提交的情况
commit; 会让事务提交
ddl; ddl语句之前会先执行一个commit
某些软件正常退出
事务回滚的情况
rollback;
某些软件非正常退出
会话超时被中段
会话被强行杀掉
语句执行失败;
2.一致性:通过redo和undo来保证事务的一致性,不会因为数据库崩溃而造成数据的不一致,所有已提交事务会被前滚,未提交事务会被回滚;
3.隔离性:一个事物不会影响其他事务运行;
4.持久性:事务成功完成之后,对数据库的修改被永久保存。
innodb对用户的承诺
已提交事务一定会被保存,未提交事务一定被回滚
事务隔离级别
MySQL事务隔离级别
未提交读:
这个没有隔离性
已提交读
对于select,通过undo来实现
对于DML,通过行锁实现
对于已提交读,不能避免幻读,但是可以满足绝数据库大多数的业务场景要求
可重复读
对于select,通过undo的mvcc特性来实现
对于DML通过行锁和GAP锁来实现
能够实现在一个事务中,对于数据访问的一致性
会带来undo增加,性能负担增加。gap锁
尽量避免GAP锁,表上建立合理的主键
序列化读
保证完全执行完全序列化
会出现写阻塞读的情况
不建议采用
事务隔离级别的最佳实践
采用已提交读事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
序列化/串行化(serializable) | 否 | 否 | 否 |