在同一个表中同时进行读写操作的有效方法..?

时间:2014-08-20 17:22:48

标签: mysql sql sql-server-2008 sql-server-2008-r2

我遇到以下情况的生产问题。

我有一个包含6200万行的表,并且用户尝试使用上传功能将50000行插入表中。与此同时,另有100名用户试图阅读该表。因为,在这种同时读写操作中,数据库被挂起,因此页面没有被加载。

我们已经为我们正在进行读操作的列提供了足够的索引键。

我对使用视图有一个想法,但我怀疑的是,如果我们使用视图进行读操作,那么并发写操作值是否会反映到视图中?

请让我知道其他任何可能的方法。

1 个答案:

答案 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语句有帮助。

如果您不确定脏读是什么,您应该在将它们放入您的应用程序之前先阅读它们。

如果这不是一个选项,那么您可能需要查看创建数据库的快照或复制副本(我更喜欢复制),并将所有读取操作指向该数据副本。