首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MySQL中优先考虑写入/更新而不是读取?

如何在MySQL中优先考虑写入/更新而不是读取?
EN

Stack Overflow用户
提问于 2012-12-31 19:01:31
回答 2查看 2.3K关注 0票数 1

在我的应用程序中,我希望在写入某些数据的请求到来时立即执行对数据库的任何插入操作。

我使用的是InnoDB引擎。

由于插入需要排它锁,因此有可能在当前读查询具有共享锁的同时,可能会有一些其他的读操作再次具有共享锁,并且写操作可能需要等待很长时间。

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

如何实现这一点?

编辑

因为我使用的是InnoDB表,而不是实现表锁,所以在select和insert之间应该不会有冲突。它将是选择和更新。(如果select和insert之间也可能有冲突,请纠正我)

在MySQL中,update的优先级高于select。但是如果有一些读查询正在执行,那么更新查询就会紧跟在一些读查询之后。在这种情况下,在update之后到来的读查询是等待这里提到的http://dev.mysql.com/doc/refman/5.0/en//table-locking.html完成更新,还是它们将与update查询被触发之前存在的读查询一起获得共享锁?

EN

回答 2

Stack Overflow用户

发布于 2013-01-02 19:28:32

从数据库读取数据时,您不需要获取共享锁。事实上,使用默认的事务隔离级别,一个事务内的普通SELECT查询可以从一致的快照中读取。没有获取和要求任何锁,在这个事务中,您根本看不到在其他事务中提交的任何更改。

由于没有获取任何共享锁,因此更新查询的排它锁将按照提交顺序立即授予其他会话。

MySQL文档中写道:

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

假设您在缺省的可重复读隔离级别下运行。当您发出一致的读取(即普通的SELECT语句)时,InnoDB将为您的事务提供一个时间点,根据该时间点,您的查询将看到数据库。如果另一个事务在分配了您的时间点之后删除了一行并提交,您看不到该行已被删除。插入和更新的处理方式类似。

票数 1
EN

Stack Overflow用户

发布于 2012-12-31 19:45:44

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

不幸的是,它在innodb上不可用。

PS:如果表上已经存在共享锁,则无法获取排它锁。所以基本上,在你的情况下:3次读取获得一个共享锁,一次插入需要排他锁。只有在选择完成后,插入才能获得锁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14100717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档