如何优先考虑在MySQL中读取/更新读取?

时间:2012-12-31 11:01:31

标签: mysql concurrency innodb

在我的应用程序中,我希望在写入一些数据的请求出现后立即执行对数据库的任何插入。

我正在使用InnoDB引擎。

由于插入需要独占锁定,因此当前读取查询可能具有共享锁定时,可能会出现一些其他读取,这些读取再次具有共享锁定,并且写入操作可能需要等待很长时间。

我希望当队列中有写操作时,没有读操作会获得共享锁。一旦在当前写请求之前启动的读取完成,就应该执行写操作。之后,应该进行所有其他的读操作。

如何实施?

修改

由于我使用InnoDB表并且我没有实现表锁,因此select和insert之间不应该存在冲突。它将是选择和更新。 (如果select和insert之间可能存在冲突,请纠正我)

在MySQL中,update的优先级高于select。但是如果正在执行一些读取查询,则会出现更新查询,然后是一些读取查询。在这种情况下,更新后的读取查询是否等待更新完成,如此处所述http://dev.mysql.com/doc/refman/5.0/en//table-locking.html或者它们将获得共享锁以及更新查询被触发之前的读取查询?

2 个答案:

答案 0 :(得分:1)

从数据库读取时,您不需要获取共享锁。事实上,在一个事务中,默认事务隔离级别REPEATABLE READ普通SELECT查询从一致快照读取。在此事务中,您不会获取任何锁定,也不会看到在其他事务中提交的任何更改。

由于未获取共享锁,因此用于更新查询的排他锁将按其提交的顺序立即授予其他会话。

MySQL doc说以下

  

一致性读取是InnoDB在READ COMMITTED和REPEATABLE READ隔离级别中处理SELECT语句的默认模式。一致读取不会对其访问的表设置任何锁定,因此其他会话可以在对表执行一致读取的同时自由修改这些表。

     

假设您正在以默认的REPEATABLE READ隔离级别运行。当您发出一致读取(即普通SELECT语句)时,InnoDB会为您的事务提供一个时间点,您的查询将根据该时间点查看数据库。如果另一个事务删除了一行并在分配了您的时间点后提交,则您不会将该行视为已删除。插入和更新的处理方式相似。

答案 1 :(得分:0)

您可以尝试查看INSERT DELAYED Mysql Insert Delayed

不幸的是,它不适用于innodb。

PS:如果桌面上已有共享锁,则无法获取独占锁。所以基本上,在你的情况下:3个读取获取共享锁,一个插入需要独占锁。只有在选择完成后,插入才能获得锁定。