`
nihongye
  • 浏览: 102098 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql的repeatable read事务隔离级别的测试

阅读更多
刚好做了一个mysql的repeatable read事务隔离级别的测试,帖出来大家看看:
准备工作:
 CREATE TABLE `t` (                                       
          `id` int(5) NOT NULL default '0',                      
          `name` varchar(255) default NULL,                      
          `version` int(5) default NULL,                         
          PRIMARY KEY  (`id`)                                    
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC  

insert into t (id,name,version) values (1,'c1',1);


client1:
start transaction;

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from t where id = 1;
+----+------+---------+
| id | name | version |
+----+------+---------+
|  1 | c1   |       1 |
+----+------+---------+
1 row in set (0.00 sec)



client2:
start transaction;
mysql> select * from t where id = 1;
+----+------+---------+
| id | name | version |
+----+------+---------+
|  1 | c1   |       1 |
+----+------+---------+
1 row in set (0.00 sec)


client1:

mysql> update t set name='c1_1',version=2 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t where id =1;
+----+------+---------+
| id | name | version |
+----+------+---------+
|  1 | c1_1 |       2 |
+----+------+---------+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.02 sec)

client2:

//因为repeatable read,只看到client1提交前的数据
mysql> select * from t where id=1 and version=1;
+----+------+---------+
| id | name | version |
+----+------+---------+
|  1 | c1   |       1 |
+----+------+---------+
1 row in set (0.00 sec)


mysql> update t set name='c2',version=3 where id = 1 and version = 1;
//影响行数为0
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> update t set name='c2',version=3 where id = 1 and version = 2;
//影响行数为1,说明更新语句的执行是看到提交的数据的
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
总结:在mysql,repeatable read级别的事务,只保证看到的数据是一个镜像.
就算该行数据被别的事务修改,当该事务也对数据进行修改,在提交时也不会产生任何错误.
解决的办法:
1.在应用端使用乐观锁的机制
2.或者使用select .. for update或者SELECT ... LOCK IN SHARE MODE来对数据加.

相关知识见:
http://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html
http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-isolation.html
分享到:
评论
2 楼 medicine 2013-05-14  
1 楼 atomicsun 2011-06-22  
写的太好了 赞个,正需要这个测试 参考 ,多谢博主

相关推荐

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

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

    MySQL的四种事务隔离级别

    为了在不同隔离级别下测试和观察事务行为,文中还提供了如何使用SQL命令来设置和查询当前事务的隔离级别的方法,例如使用SET SESSION TRANSACTION ISOLATION LEVEL命令来设置当前会话的事务隔离级别,并使用select @...

    MySQL事务隔离级别

    事务隔离级别主要涉及四个方面:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。接下来,我们将深入探讨这些级别以及它们在实际应用中的影响。 ...

    浅析MYSQL REPEATABLE-READ隔离级别

    REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变。这种隔离级别可能导致读到的东西是已经修改过的。 比如: 回话一中读取一个字段一行a=1 在回话二里这个字段该行...

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

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

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

    数据库的事务隔离级别是用来解决读一致性问题的,常见的隔离级别有Read Uncommitted、Read Committed、Repeatable Read和Serializable四种。Mysql默认的事务隔离级别是可重复读,可以通过设置tx_isolation变量来修改...

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

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

    深入理解Mysql锁与事务隔离级别1

    《深入理解MySQL锁与事务隔离级别》 在数据库管理中,锁和事务隔离级别是确保数据一致性与并发控制的重要概念。本文将详细阐述MySQL中的锁机制以及事务的四种隔离级别,以帮助读者更好地理解和应用这些关键概念。 ...

    VIP-深入理解Mysql锁与事务隔离级别1

    【MySQL锁与事务隔离级别详解】 在数据库管理系统中,锁是一种关键的同步机制,用于管理多个用户或进程并发访问共享资源时的并发控制。本文将深入探讨MySQL中的锁以及事务隔离级别。 首先,我们理解一下**锁的定义...

    mysql事务隔离级别1

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

    mysql数据库事务隔离级别借鉴.pdf

    以下是对MySQL数据库事务隔离级别的详细解释。 1. **丢失更新**:在并发环境下,一个事务的更新可能被另一个事务的更新覆盖,导致前一个事务的更改丢失。 2. **脏读**:一个事务读取到了另一个事务还未提交的数据...

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

    在Mysql数据库中,默认的事务隔离级别是Repeatable Read,可以通过设置transaction isolation level的方式来改变事务隔离级别。锁机制在Mysql数据库中也可以通过加锁的方式来实现,例如select * from T where id=1 ...

    mysql数据库事务隔离级别[参照].pdf

    MySQL数据库提供了四种不同的事务隔离级别,它们分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)以及串行化(Serializable)。每种隔离级别都有其特点,用于权衡数据...

    spring常用数据库事务传播属性和事务隔离级别1

    Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...

    MySQL事务隔离级别详解.docx

    为了解决这些问题,MySQL提供了四种事务隔离级别:Read Uncommitted、Read Committed、Repeatable Read 和Serializable。 Read Uncommitted(读未提交数据)是指一个事务在执行过程中可以看到其他事务没有提交的新...

    事务隔离级别 .pdf

    在MySQL中,可以通过`SET TRANSACTION`语句来设定事务隔离级别。例如,将当前会话的隔离级别设置为可重复读: ```sql SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 查看当前的事务隔离级别,可以使用...

    MySQL查看和修改事务隔离级别的实例讲解

    这个操作将返回当前数据库的事务隔离级别设置,例如REPEATABLE-READ。从给出的内容中,我们可以看到具体的命令和返回的查询结果。 在MySQL 8.0.3之后,原先的tx_isolation变量已被transaction_isolation变量取代,...

Global site tag (gtag.js) - Google Analytics