小编典典

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

sql

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

例如:

  • 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和读取Cars表之间被删除了。

我有几个问题:

  1. 一张一张地从多个表中进行读取时,防止修改的正确方法是什么?在读取所有表之前,不得修改表。

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

  1. 如果我在本地SQL Server Express数据库上运行,无论做什么都无法使其正常运行。如果我在联网的SQL Server 2005数据库上运行,则可以使它工作(需要付出一些努力)。SQL Server Express是否支持SERIALIZABLE事务隔离级别?我相信应该。差异可能是由于网络连接速度较慢,但​​我不知道。

在我的本地数据库上,我无法阻止两次读取之间的修改。也就是说,一个线程会随机删除一个随机所有者(先是车,然后是书籍,然后是所有者),或者插入一个新所有者(插入所有者,插入2辆汽车,插入2本书)。另一个线程正在读取使用:

    Begin Tran
Select owner_id From Owner
Select owner_id, brand From Cars
Select owner_id, title, author From Books
Commit Tran

无论我做什么,有时我都会得到拥有零辆汽车或零本的所有者。这绝不应该发生,因为所有插入和删除都在单个事务中。我似乎快递服务器不会同时锁定Owner,Cars和Books语句。

在联网的SQL Server 2005上,它可以正常工作,但是可能是由于连接速度较慢,因此降低了同时执行的可能性。

  1. 在我的本地数据库上,我Select将从所有表中的虚拟对象开始每个事务,以防止死锁。我不明白为什么这可以防止死锁,但不能防止对表的修改。在联网的SQL Server 2005上这不是必需的。

目前,我无法判断我是否对事务隔离有误解,或者是SQL Server Express和SQL Server 2005之间存在差异的问题。我们将不胜感激。


阅读 207

收藏
2021-04-28

共1个答案

小编典典

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

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

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

2021-04-28