刚好做了一个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
分享到:
相关推荐
事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...
为了在不同隔离级别下测试和观察事务行为,文中还提供了如何使用SQL命令来设置和查询当前事务的隔离级别的方法,例如使用SET SESSION TRANSACTION ISOLATION LEVEL命令来设置当前会话的事务隔离级别,并使用select @...
事务隔离级别主要涉及四个方面:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。接下来,我们将深入探讨这些级别以及它们在实际应用中的影响。 ...
REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变。这种隔离级别可能导致读到的东西是已经修改过的。 比如: 回话一中读取一个字段一行a=1 在回话二里这个字段该行...
MySQL 支持四种事务隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。每种隔离级别对应不同程度的事务并发问题的防范,其中,MySQL ...
数据库的事务隔离级别是用来解决读一致性问题的,常见的隔离级别有Read Uncommitted、Read Committed、Repeatable Read和Serializable四种。Mysql默认的事务隔离级别是可重复读,可以通过设置tx_isolation变量来修改...
MySQL数据库的事务隔离级别是数据库管理系统中用于控制事务处理中并发操作的重要机制。在多用户同时访问数据库的情况下,事务隔离级别能够确保数据的一致性和完整性,避免并发操作带来的各种问题,如脏读、不可重复...
《深入理解MySQL锁与事务隔离级别》 在数据库管理中,锁和事务隔离级别是确保数据一致性与并发控制的重要概念。本文将详细阐述MySQL中的锁机制以及事务的四种隔离级别,以帮助读者更好地理解和应用这些关键概念。 ...
【MySQL锁与事务隔离级别详解】 在数据库管理系统中,锁是一种关键的同步机制,用于管理多个用户或进程并发访问共享资源时的并发控制。本文将深入探讨MySQL中的锁以及事务隔离级别。 首先,我们理解一下**锁的定义...
MySQL中的事务隔离级别是数据库管理系统确保事务之间相互独立的重要机制,它主要针对并发操作时可能出现的问题,如脏读、不可重复读和幻读等。在MySQL的InnoDB存储引擎中,有四种不同的事务隔离级别: 1. **读未...
以下是对MySQL数据库事务隔离级别的详细解释。 1. **丢失更新**:在并发环境下,一个事务的更新可能被另一个事务的更新覆盖,导致前一个事务的更改丢失。 2. **脏读**:一个事务读取到了另一个事务还未提交的数据...
在Mysql数据库中,默认的事务隔离级别是Repeatable Read,可以通过设置transaction isolation level的方式来改变事务隔离级别。锁机制在Mysql数据库中也可以通过加锁的方式来实现,例如select * from T where id=1 ...
MySQL数据库提供了四种不同的事务隔离级别,它们分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)以及串行化(Serializable)。每种隔离级别都有其特点,用于权衡数据...
Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...
为了解决这些问题,MySQL提供了四种事务隔离级别:Read Uncommitted、Read Committed、Repeatable Read 和Serializable。 Read Uncommitted(读未提交数据)是指一个事务在执行过程中可以看到其他事务没有提交的新...
在MySQL中,可以通过`SET TRANSACTION`语句来设定事务隔离级别。例如,将当前会话的隔离级别设置为可重复读: ```sql SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 查看当前的事务隔离级别,可以使用...
这个操作将返回当前数据库的事务隔离级别设置,例如REPEATABLE-READ。从给出的内容中,我们可以看到具体的命令和返回的查询结果。 在MySQL 8.0.3之后,原先的tx_isolation变量已被transaction_isolation变量取代,...