mysql的事务隔离级简单理解来喽
今日份学习,数据库的ACID 学着学着就到了事务的隔离级别,看了一篇博客,觉得甚好,再此记录下自己的理解,如有不正之处,请各位大神 指出~
附上原文博客:http://c.biancheng.net/view/7265.html
事物的隔离级别分别是:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 READ UNCOMITTED | 有 | 有 | 有 |
读已提交 READ COMITTED | 无 | 有 | 有 |
可重复读 REPEATABLE READ | 无 | 无 | 有 |
串行化 SERIALIZABLE | 无 | 无 | 无 |
1.读未提交 READ UNCOMITTE
A窗口在一个事务中,可以查到B窗口未提交的事务。两个是不同的事务。存在脏读,不可重复读,幻读问题。
2.读已提交 READ COMMITTED
A窗口在一个事务中,不可查到B窗口未提交的事务。两个是不同的事务,只能查到提交事务后的修改内容,解决了脏读问题,
但并不能解决不可重复读,和幻读问题,因为可能在B提交事务之后,其他事务又对数据进行操作,进而修改数据,造成A不可重复读。
3.可重复读 REPEATABLE READ
在 A事务未结束之前读到的仍旧是事务开始那一刻的数据情况,但此时B新增数据提交事务后,
A新增同样的id的数据新增不成功且报错,造成幻读的情况。
4.串行化 SERIALIZABLE
如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来。那么这种隔离级别就称之为串行化。
SERIALIZABLE 是最高的事务隔离级别,主要通过强制事务排序来解决幻读问题。简单来说,就是在每个读取的数据行上加上共享锁实现,这样就避免了脏读、不可重复读和幻读等问题。但是该事务隔离级别执行效率低下,且性能开销也最大,所以一般情况下不推荐使用。
第一次查询自己本地mysql隔离级别 是可重复读 以下是解释
[MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog。可重复读能提供SQL语句的写可串行化,保证了主从一致]
奥,对啦,附上更改隔离级别的方便查阅。
-- 设置隔离级别为读未提交
-- SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 设置隔离级别为读已提交
-- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 设置隔离级别为可重复读
-- SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 设置隔离级别为串行化
-- SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 查询数据库隔离级别
-- SELECT @@tx_isolation;
以上操作基于以下mysql操作版本;