在mysql中写入READ

时间:2014-11-18 19:50:41

标签: mysql transactions serializable isolation-level isolation

我是mysql事务序列化的新手。当我尝试更新表的一行而其他并发会话正在读取它时,更新事务必须等到读事务完成。有没有办法允许写入事务继续进行(然后读取事务应该无法提交)?

以下是我验证上述属性的测试:

第1节:

set transaction isolation level serializable;
create database locktest;
use locktest;
create table locktest(id int not null primary key auto_increment, text varchar(100));
insert into locktest(text) values('text1');

start transaction;
select * from locktest where id=1;

第二节:

use locktest;
update locktest set text='new_text2' where id=1;  -- it gets stuck at this point and only proceed forward when I 'commit;' in session 1

我想要的是会话2的更新必须立即成功,并且会话1的事务应该中止。有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:0)

InnoDB实现中的

SERIALIZABLE意味着SELECT的行为类似于SELECT ... LOCK IN SHARE MODE。

如果会话1没有使用START TRANSACTION,而只是依赖于自动提交,那么MySQL对SERIALIZABLE的想法将像SELECT一样运行一个只读语句,就像REPEATABLE-READ一样。它不会锁定任何东西,它不会阻止会话2中的UPDATE。

但是会话2中的UPDATE无法使会话1中的SELECT中止。这不是SERIALIZABLE的行为。

另请参阅我今天早些时候恰巧提出的MySQL - Mutual exclusion in transactions and locks?的答案。

您可以在此处详细了解事务隔离模式:http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html