我是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的事务应该中止。有什么建议吗?感谢。
答案 0 :(得分:0)
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