我遇到以下情况的生产问题。
我有一个包含6200万行的表,并且用户尝试使用上传功能将50000行插入表中。与此同时,另有100名用户试图阅读该表。因为,在这种同时读写操作中,数据库被挂起,因此页面没有被加载。
我们已经为我们正在进行读操作的列提供了足够的索引键。
我对使用视图有一个想法,但我怀疑的是,如果我们使用视图进行读操作,那么并发写操作值是否会反映到视图中?
请让我知道其他任何可能的方法。
答案 0 :(得分:1)
这个答案仅适用于Microsoft SQL Server(不是MySQL),我假设它是基于附加标签的RDBMS(sql-server-2008 / -r2)。
如果您不关心“脏读” - 您有两个选项可以基本忽略插入操作所施加的锁定。
在脚本的顶部添加set transaction isolation level read uncommitted
或在每个表添加with(nolock)
之后 - 它们实际上是相同的,但前者适用于查询中的所有表,后者仅适用到你附加的表格。
例如:
set transaction isolation level read uncommited
select *
from mytable
where id between 1 and 100
EX2:
select *
from mytable with(nolock)
where id between 1 and 100
注意:这仅对select语句有帮助。
如果您不确定脏读是什么,您应该在将它们放入您的应用程序之前先阅读它们。
如果这不是一个选项,那么您可能需要查看创建数据库的快照或复制副本(我更喜欢复制),并将所有读取操作指向该数据副本。