mysql中的写-读
我是mysql事务可序列化的新手。当我试图在其他并发会话读取一行表时更新该行时,更新事务必须等到读取事务完成。是否有任何方法允许写入事务向前进行,然后读取事务将无法提交 以下是我验证上述属性的测试: 第1场会议:mysql中的写-读,mysql,transactions,serializable,isolation-level,isolation,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_in
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;
第2次会议:
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的事务应该中止。有什么建议吗?谢谢。在InnoDB实现中可序列化意味着SELECT在共享模式下的行为类似于SELECT…LOCK 如果会话1不使用START TRANSACTION,而只是依赖于autocommit,那么MySQL的SERIALIZABLE思想将运行类似SELECT的只读语句,就像REPEATABLE-read一样。它不会锁定任何东西,也不会阻止会话2中的更新 但是会话2中的更新无法导致会话1中的选择中止。这不是SERIALIZABLE的行为 另请参见我今天早些时候偶然提出的答案
您可以在此处阅读有关事务隔离模式的更多详细信息:因此,如果我有两个读写事务:一个读取数据项1,然后更新数据项2,另一个更新数据项1,然后读取数据项2,那么它们不可能同时发生。两个事务相互等待,直到锁等待超时超过,然后重试,希望事务能够获得所需数据项上的所有锁并能够继续。是这样吗?我以前与Oracle合作过,在本例中,事务返回类似“ORA 8177”的内容。无法序列化对此事务“”的访问。这是否与mysql中的“锁等待超时超过”相同?@HieuNguyen,在您描述的场景中,如果您使用SERIALIZABLE,则第一个事务将在数据项1上获得共享锁,在数据项2上获得独占锁。第二个事务需要一个排他锁来更新数据项1,但是当该数据上有一个共享锁时,它无法获得排他锁。因此,第二个事务将一直等到锁定等待超时。