刚好做了一个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
分享到:
相关推荐
事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...
REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变。这种隔离级别可能导致读到的东西是已经修改过的。 比如: 回话一中读取一个字段一行a=1 在回话二里这个字段该行...
数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。 Repeatable read:可以防止脏...
按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ)。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用–transaction-isolation选项,或在选项文件里,为所有连接设置...
数据库隔离级别有四种,应用《高性能mysql》一书中的说明:然后说说修改事务隔离级别的方法:1.全局修改,修改mysql.ini配置文件,在最后加上#可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,...
再加上很多书都说可重复读解决了幻读问题,比如《mysql技术内幕–innodb存储引擎》等,不一一列举了,因此网上关于事务隔离级别的文章大多是有问题的,所以再开一文说明! 本文所讲大部分内容,皆有官网作为佐证,...
MySQL的四种事务隔离级别:Read-uncommitted、Read-committed、Repeatable-read、Seriailizable,相信大家都清楚各自异同,不清楚的朋友可以查看另外一篇技术文章:MySQL_InnoDB之事务与锁详解。但是对于第二类、第...
事务:保证数据一致性,要么执行,要么不执行,mysql默认事务隔离级别:REPEATABLE-READ开启事务三个问题不可重复读:指在一个事务中,对同一数据进行
然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 代码如下: #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. [mysqld] transaction-...
目录1、事务概念2、事务使用3、事务的四大特征(ACID)3.1 原子性(atomicity)3.2 一致性(Consistency)3.3 隔离性(Isolation)3.3.1 read uncommitted(读未提交的);3.3.2 read committed(读已提交的);3.3.3 ...
并发访问问题 事务隔离级别 丢失修改 MySQL 所有事务隔离级别在数据库层面上均可避免 脏读 READ-COMMITTED 事务隔离级别以上可避免 不可重复读 REPEATABLE-READ 事务隔离级别以上可避免 幻读 SERIALIZABLE 事务隔离...
Repeatable Read –可重复读-(在当前事务内,重复读取第一次读取过的数据就叫可重复读。) 3、修改A端的隔离级别为readuncommitted –读未提交。意思是可以读取别人没有提交的数据。 set transactionisolation ...
数据库事务隔离分为4个隔离级别。 MySQL的默认隔离级别就是Repeatable read。 由低到高: Read Uncommitted(读未提交) Read committed(读提交) Repeatable read(可重复读) Serializable(序列化 )。
不再维护-请分叉或寻求其他解决方案transaction_isolation 以与数据库无关的方式在ActiveRecord中设置事务隔离级别。 只要您使用的是新适配器mysql2,pg或sqlite3,就可以与MySQL,PostgreSQL和SQLite一起使用。 ...
MySQL数据库为我们提供的四种隔离级别: ... Mysql 的默认事务级别是: Repeatable read Oracle的默认事务级别是:Read committed 查看数据库的事务级别命令是:select @@tx_isolation;
在这篇文章里我将讨论一个相关的主题 – InnoDB 事务隔离模式,还有它们与MVCC(多版本并发控制)的关系,以及...REPEATABLE READ – 这是默认的隔离级别,通常它是相当不错的,对应用程序的便捷性来说也不错。它在第
事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 可能 可能 可能 不可重复读(read-committed) 不可能 可能 可能 可重复读(repeatable-read) 不可能 不可能 InnoDB不可能 串行化...
2) mysql事务隔离级别 Read Committed(读取提交内容) 如果是Django2.0以下的版本,需要去修改到这个隔离级别,不然乐观锁操作时无法读取已经被修改的数据 RepeatableRead(可重读) 这是这是Mysql默认的隔离...