专栏目录请点击
多事务并发
脏读
事务1
更新了记录,但是还没有提交,此时,事务2
读取了更新后的记录,然后事务1
又进行了回滚。目前,事务2
读取的数据是无效的数据
不可重复读
事务1
读取了记录,事务2
更新了这条记录,并进行了提交,当事务1
再次读取的这条记录的时候,就会发现值不相同了
幻读
- 事务1读取了一个字段,事务2在这个表中插入了几行,当事务1再次读取当前表的时候就会发现表的行数不同了
为了解决上面的问题,数据库就必须拥有隔离并发运行的能力,来避免各种问题
隔离级别
简介
- 一个事务与其他事务的隔离程度称为隔离级别
- 一般隔离性越高,数据的一致性就越好,但并发性就越弱
类别
隔离级别 | 简介 |
---|---|
READ UNCIMMITTED(未提交读) | 事务中的修改,即使没有提交,其他事务也可以看得到,比如脏读问题,不可重复读和幻读都可出现。如无必要,不要随便使用 |
READ COMMITTED(提交读) | 大多数数据库系统的默认隔离级别是READ COMMITTED,这种隔离级别就是一个事务的开始,只能看到已经完成的事务的结果,正在执行的,是无法被其他事务看到的。可以解决脏读问题,但不能解决其他两个问题 |
REPEATABLE READ(可重复读) | 确保事务可以多次从一个字段中读取相同的值,在这个事务持续的期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读问题,但是不能解决幻读问题 |
SERIALIZABLE(可串行化) | SERIALIZABLE是最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的幻读情况,由于他大量加上锁,导致大量的请求超时,因此性能会比较底下,再特别需要数据一致性且并发量不需要那么大的时候才可能考虑这个隔离级别 |
查看数据库的隔离级别
语法一
查询系统变量
SHOW VARIABLES LIKE 'tx_isolation';
SHOW VARIABLES LIKE 'transaction_isolation';
语法二
访问系统变量
SELECT @@tx_isolation;
SELECT @@transaction_isolation;
编辑数据库的隔离级别
设置当前 mySQL的隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
设置全局的隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;