Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql中的写-读_Mysql_Transactions_Serializable_Isolation Level_Isolation - Fatal编程技术网

mysql中的写-读

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

我是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;
第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,但是当该数据上有一个共享锁时,它无法获得排他锁。因此,第二个事务将一直等到锁定等待超时。