`

mysql的隔离级别

阅读更多

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 */









































 

分享到:
评论
1 楼 oritenson 2010-08-06  
学习了,哈哈

相关推荐

    MySQL事务隔离级别

    MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...

    Mysql的四种隔离级别

    Mysql的四种隔离级别 Mysql的四种隔离级别 Mysql的四种隔离级别

    52 MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?l.pdf

    MySQL 支持四种事务隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。每种隔离级别对应不同程度的事务并发问题的防范,其中,MySQL ...

    MySQL的四种事务隔离级别

    MySQL数据库管理系统提供了四种事务隔离级别来处理事务并发中可能遇到的问题。事务并发问题通常包括脏读、不可重复读和幻读。 一、事务的基本要素(ACID) 事务具有四个基本要素,即原子性(Atomicity)、一致性...

    MY SQL 事务隔离 查询:默认事务隔离级别

    查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别

    MySQL数据库:事务隔离级别.pptx

    事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...

    06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf

    深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...

    关于Mysql隔离级别、锁与MVCC介绍

    MySQL数据库在处理并发事务时,采用了多种机制来确保数据的一致性和隔离性,其中关键的概念包括隔离级别、锁以及多版本并发控制(MVCC)。理解这些机制有助于优化数据库性能和解决并发冲突。 首先,隔离级别是...

    MySQL lock & 隔离级别

    来自一线大厂的MySQL lock 隔离级别的相关介绍,很赞,强烈推荐

    56 MySQL最牛的RR隔离级别,是如何基于ReadView机制实现的?l.pdf

    MySQL的可重复读(RR)隔离级别是一种重要的事务隔离级别,旨在避免不可重复读和幻读问题,保证事务在并发环境下的一致性。ReadView(读视图)机制是实现这一隔离级别核心手段之一。本文将详细解析MySQL RR隔离级别...

    深入解析MySQL的隔离级别配置及其影响.rar

    本文将详细介绍MySQL的隔离级别,如何配置它们,以及不同隔离级别对数据库性能和并发能力的影响。 选择合适的隔离级别对于确保数据库的并发性能和数据一致性至关重要。通过理解不同隔离级别的特点和影响,数据库管理...

    MySQL数据库事务隔离级别详解

    MySQL数据库的事务隔离级别是数据库管理系统中用于控制事务处理中并发操作的重要机制。在多用户同时访问数据库的情况下,事务隔离级别能够确保数据的一致性和完整性,避免并发操作带来的各种问题,如脏读、不可重复...

    Mysql的隔离级别与锁

    MySQL数据库在处理并发事务时,隔离级别和锁机制起着至关重要的作用,它们确保了数据的一致性和安全性。本文将详细探讨这两个概念及其在生产环境中的应用。 首先,`autocommit` 参数决定了MySQL是否会自动提交事务...

    mysql事务隔离级别1

    MySQL中的事务隔离级别是数据库管理系统确保事务之间相互独立的重要机制,它主要针对并发操作时可能出现的问题,如脏读、不可重复读和幻读等。在MySQL的InnoDB存储引擎中,有四种不同的事务隔离级别: 1. **读未...

    mysql原理之隔离级别1

    MySQL 数据库中的事务隔离级别是确保数据库在高并发环境下数据一致性的重要机制。SQL 标准定义了四个隔离级别,它们分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable,每种级别都针对不同...

    mysql 8.0.22.0 下载安装配置方法图文教程

    mysql 8.0.22 下载安装配置方法,供大家参考,具体内容如下 ... ... 您可能感兴趣的文章:mysql多版本并发控制MVCC的实现关于Mysql隔离级别、锁与MVCC介绍SpringBoot中通过实现WebMvcConfigurer参数

    MySQL数据库隔离级别1.txt

    MySQL数据库隔离级别

    Mysql事务隔离级别.docx

    Mysql事务隔离级别.docx

Global site tag (gtag.js) - Google Analytics