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操作版本;

 

posted @ 2022-11-23 17:17  ldlei  阅读(37)  评论(0编辑  收藏  举报