mysql的隔离级别的查看:
select @@tx_isolation;
默认的隔离级别是REPEATABLE-READ(可重复读)。
可通过如下sql语句改变其隔离级别
set transaction isolation level read uncommitted;
注:javascript:mctmp(0);
http://www.iteye.com/topic/322382 写道
在数据库系统中,隔离 是定义一个操作对数据所做的改变如何/何时对其它的并行 操作可见。
隔离级别
数据库系统有四个隔离级别。对数据库使用何种隔离级别要审慎分析,因为
1. 维护一个最高的隔离级别虽然会防止数据的出错,但是却导致了并行度的损失,以及导致死锁出现的可能性增加。
2. 然而,降低隔离级别,却会引起一些难以发现的bug。
在不同的并行控制模式下,对各隔离级别的实现是不同的。
SERIALIZABLE(序列化)
所有的数据库事务都完全隔离,就如系统中所有的事务都顺序执行一样,一个接着一个。当然,数据库可以同时执行多个事务,只要顺序执行的“错觉”可以维护(即同时执行的多个事务不会互相干扰,或者多个事务的同时执行能保证结果的正确)。
a. 基于锁的并行控制。(当执行一个带有范围的where子句的查询时,需要范围锁定)
b. 无锁并行控制。不需要锁,但是当系统检测到并行的事务违反了序列化“错觉”,它会迫使那个事务回退,所以应用程序需要重新启动那个事务。
幻读,脏读,不可重复读等问题都不会发生。
REPEATABLE READ(可重复读)
所有查询到的数据记录都不会被改变。即会在所有获取的数据上加上读锁,但是不会加上范围锁。
可能发生的问题:当执行一个范围查询时,可能会发生幻读。
READ COMMITTED(提交读)
一个查询所获取的数据可以被其他事务修改。
读锁:在所读取的数据上添加读锁,但会立即释放。
写锁:不会释放,直到事务完结。
可能发生的问题:不可重复读。
READ UNCOMMITTED(未提交读)
一个事务可以看见另一个事务所做的未提交修改。
可能发生的问题:脏读。
总结:
可以看到,对于前三种隔离级别,其实他们的不同是通过对获取的数据实行不同类型的共享机制来实现,比如添加范围锁、读锁或者立即释放读锁等来实现,但跟排他锁无关。
隔离级别 添加的共享锁
序列化 范围锁
可重复读 读锁
提交读 立即释放读锁
而对于第四种隔离级别:未提交读,一个事务可以看到另一个事务未提交的数据。
问题
我们看到,当执行不同的隔离级别时,可能会发生各种各样不同的问题。下面对它们进行总结并举例说明。
幻读
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。
发生的情况:没有范围锁。
例子:
事务1 事务2
SELECT
* FROM
users
WHERE
age BETWEEN
10
AND
30
;
INSERT
INTO
users VALUES
(
3
, 'Bob'
, 27
)
;
SELECT
* FROM
users WHERE
age BETWEEN
10
AND
30
;
如何避免:实行序列化隔离模式,在任何一个低级别的隔离中都可能会发生。
不可重复读
在基于锁的并行控制方法中,如果在执行select时不添加读锁,就会发生不可重复读问题。
在多版本并行控制机制中,当一个遇到提交冲突的事务需要回退但却被释放时,会发生不可重复读问题。
事务1 事务2
SELECT
* FROM
users WHERE
id = 1
;
UPDATE
users SET
age = 21
WHERE
id = 1
;
COMMIT; /* in multiversion concurrency*/
control, or lock-based READ COMMITTED *
SELECT
* FROM
users WHERE
id = 1
;
COMMIT; /* lock-based REPEATABLE READ */
在上面这个例子中,事务2提交成功,它所做的修改已经可见。然而,事务1已经读取了一个其它的值。在序列化和可重复读的隔离级别中,数据库管理系统会返回旧值,即在被事务2修改之前的值。在提交读和未提交读隔离级别下,可能会返回被更新的值,这就是“不可重复读”。
有两个策略可以防止这个问题的发生:
1. 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。
2. 而在多版本并行控制中,事务2可以被先提交。而事务1,继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功。如果不是,事务1会被回退。
脏读
脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。
事务1 事务2
SELECT
* FROM
users WHERE
id = 1
;
UPDATE
users SET
age = 21
WHERE
id = 1
SELECT
FROM
users WHERE
id = 1
;
COMMIT; /* lock-based DIRTY READ */
分享到:
相关推荐
Mysql的四种隔离级别 Mysql的四种隔离级别 Mysql的四种隔离级别
NULL 博文链接:https://cuishuangjia.iteye.com/blog/964885
查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别
52 MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?l.pdf
本篇文章给大家详细介绍了一下关于Mysql隔离级别、锁与MVCC的相关知识,有这方面兴趣的朋友参考下。
MySQL事务隔离级别详解,这个面试经常会面到,必会呀,哈哈
MySQL的四种事务隔离级别 1、脏读 2、不可重复读 3、幻读
来自一线大厂的MySQL lock 隔离级别的相关介绍,很赞,强烈推荐
06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf
数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。 Repeatable read:可以防止脏...
MySQL的四种事务隔离级别:Read-uncommitted、Read-committed、Repeatable-read、Seriailizable,相信大家都清楚各自异同,不清楚的朋友可以查看另外一篇技术文章:MySQL_InnoDB之事务与锁详解。但是对于第二类、第...
事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...
56 MySQL最牛的RR隔离级别,是如何基于ReadView机制实现的?l.pdf
mysql 8.0.22 下载安装配置方法,供大家参考,具体内容如下 ... ... 您可能感兴趣的文章:mysql多版本并发控制MVCC的实现关于Mysql隔离级别、锁与MVCC介绍SpringBoot中通过实现WebMvcConfigurer参数
MySQL数据库隔离级别
Mysql事务隔离级别.docx
1.MySQL参数autocommit生产环境设1还是0?为什么? 在生产环境中,为了事务一致性,需要把autocommit 设置为 0 这样可以进行事务全部成功后,在后一次性提交,如果某一步出错,可以rollback。 在会话进修改...
MySQL事务隔离级别详解.docx
详解Mysql事务隔离级别与锁机制.doc