前言
事务机制有很多博客文档解读,很多讲解让人误解,抽空总结一下,实操一把,记录一下详细过程。
锁操作
查看事务隔离级别(全局和会话):select @@global.tx_isolation,@@tx_isolation;
设置事务隔离级别:
set global transaction isolation level read committed; //全局的
set session transaction isolation level read committed; //当前会话
查看锁整体状态: show status like '%lock%';
查看引擎状态(可以查看到最后一次死锁信息):show engine innodb status\G;
查询是否锁表:show open tables where in_use>0;
查询正在使用的事务:select * from information_schema.innodb_trx\G;
查看正在锁的事务(只有单个事务,但没有竞争的时候查看不到相关信息):select * from information_schema.innodb_locks;
查看正在等待锁的事务:select * from information_schema.innodb_lock_waits;
锁类型
1)按照锁机制分类
- 排他锁 (X锁)
- 共享锁 (S锁)
2)按照锁数据粒度分类
- 行级锁
- 表级锁
- 页级锁
行级锁:开销大,加锁慢;会出现死锁;锁粒度最小,发生锁冲突的概率最低,并发度也最高。
表级锁:开销小,加锁快;不会出现死锁;锁粒度大,发生锁冲突的概率最高,并发度低。
页级锁:MySQL特有,开销和加锁时间在表锁和行锁之间;会出现死锁;锁粒度界表锁和行锁之间,并发度一般。
数据库事务机制
事务,保证一组操作要么全部执行,要么全部不执行,保证数据库一致性。简称ACID。
-
A 事务原子性(Atomicity)
事务中一组操作要么全部执行,要么全部不执行
-
C 事务一致性
事务的允许不改变数据的一致性
-
I 事务隔离性
两个事物执行时隔离的,不会交错执行
-
D 事务持久性
事务执行成功后,该事务对数据库所做的更改持久的保存在数据库中。
事务引发的并发调度问题
-
脏读
A事务读取B事务未提交的数据
-
不可重复读
事务中两次读取数据不一样(包括新增、更新、删除)
-
幻读
在同一事务里,多次查询的结果和事务开始第一次查询的状态一致。但是,如果另外一个事务同时提交了新数据,虽然本事务再次按照相同的条件查询得到相同的结果集,但是本事务指定更新时,就会发现这些新数据,这些数据就像“鬼影”一样出现。
事务隔离级别
- Read uncommitted 读未提交
所有事务都可以看到其他未提交事务的执行结果。存在脏读问题。
-
Read committed 读提交
一个事务只能看见已经提交事务的内容。解决了脏读,存在不可重复读问题。
-
Repeatable read 可重复读
同一个事务多次读取时,获取到的内容一致。解决了不可重复读问题,存在幻读。
- 可串行化 强制事务排序,试之不能相互冲突,解决了幻读问题
MySQL中四中隔离级别,分别可能产生的问题:
隔离级别 脏读 不可重复读 幻读
读未提交 √ √ √
读已提交 × √ √
可重复读 × × √
可串行化 × × ×