SQL Server Express和SQL Server 2005上的多个表的事务隔离和读取

时间:2011-12-09 11:33:05

标签: sql sql-server sql-server-2005 sql-server-2005-express

我有一个带有主表的数据库(让我们称之为所有者)和几个带有馆藏的子表(如汽车,书籍等)。

例如:

  • Owner包含列:owner_id, name
  • Cars包含列:owner_id (foreign key), brand
  • Books包含列:owner_id (foreign key), title, author

我的程序应该使用各种第三方库来计算像有多少宝马车主拥有哈利波特书籍这样的统计数据。我想同时读取所有表中的所有行,然后在非sql代码中进行分析。

我想使用单独的Select * From X语句读取所有表。我不能使用一个大的连接,因为它会返回太多行((所有者*汽车*书籍)而不是(所有者+汽车+书籍))。由于表格包含不同类型的不同列,因此联盟不会删除它。

我已经设置了

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

但无论如何我还有一些问题。

如果我通过运行两个线程来强调数据库,一个是随机插入或删除而另一个读取我有时会得到不一致的结果,例如Cars已经在读取Owners和读取{{1}之间被删除了表。

我有几个问题:

  1. 从多个表中逐个读取时,防止修改的正确方法是什么?在读完所有表之前,不得修改任何表。

    我正在使用SQL Server 2005(在网络上)和SQL Server 2005 Express(本地)。我可以同时显式获取多个表上的锁吗?

  2. 如果我针对我的本地SQL Server Express数据库运行,无论我做什么,我都无法使其工作。如果我运行我的网络SQL Server 2005数据库,我可以使它工作(努力)。 SQL Server Express是否支持事务隔离级别SERIALIZABLE?我相信它应该。差异可能是由于网络连接速度缓慢,但我不知道。

    在我的本地数据库中,我无法阻止读取之间的修改。也就是说,一个线程随机删除随机所有者(第一辆汽车,然后是书籍,然后是所有者)或插入一个新所有者(插入所有者,插入2辆汽车,插入2本书)。另一个主题是使用以下方式阅读:

    Cars

    无论我做什么,有时我会得到零车或零书的车主。这应该永远不会发生,因为所有插入和删除都在一个事务中。我似乎快递服务器不会同时锁定所有者,汽车和书籍声明。

    在联网的SQL Server 2005上,它运行正常,但可能是因为连接速度慢,因此同时执行的可能性较低。

  3. 在我的本地数据库中,我使用所有表中的虚拟Begin Tran Select owner_id From Owner Select owner_id, brand From Cars Select owner_id, title, author From Books Commit Tran 启动每个事务以防止死锁。我不明白为什么这会阻止死锁但不能修改表格。这在联网的SQL Server 2005上不是必需的。

  4. 目前,我无法判断我是否误解了有关事务隔离的问题,或者是否存在SQL Server Express和SQL Server 2005之间存在差异的问题。非常感谢任何帮助或见解。

2 个答案:

答案 0 :(得分:3)

您选择一次性加载所有数据意味着很少的选择:

  • 使用sp_getapplock通过相关代码序列化访问
  • 对事务中的读取使用TABLOCKX,HOLDLOCK

您遇到问题,因为SET TRANSACTION ISOLATION LEVEL SERIALIZABLE仅影响锁的隔离:您需要控制持续时间HOLDLOCK)和粒度 + 模式TABLOCKX

答案 1 :(得分:0)

  

我有时会得到不一致的结果,

除非您稍后会对未使用的数据库进行批处理,否则最好习惯一些无关紧要的波动。

除非你的条目很少,否则这些变化绝对数字无关紧要。无论如何,你处理统计数据。使用READ COMMITED并通过接受数据集不是静态来处理不一致。

其他任何东西都会完全扼杀性能。

或进行批处理。

或者:使用SNAPSHOT密封数据库的“及时查看”。