我有一个带有主表的数据库(让我们称之为所有者)和几个带有馆藏的子表(例如汽车,书籍等)。
例如:
Owner
owner_id, name
Cars
owner_id (foreign key), brand
Books
owner_id (foreign key), title, author
我的程序应该计算统计数据,例如使用各种第三方库来计算 多少宝马车主还拥有一本《哈利·波特》书 。我想同时读取所有表中的所有行,然后以非SQL代码进行分析。
我想使用单独的Select * From X语句读取所有表。我不能使用一个大联接,因为它将返回太多行((所有者汽车书籍),而不是(所有者+汽车+书籍))。联盟也不会削减它,因为表包含不同类型的不同列。
Select * From X
我已经设定
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
但是我还是有一些问题。
如果我通过运行两个线程来强调数据库,一个线程随机地插入或删除,而另一个读取有时会得到不一致的结果,例如Cars在读取Owners和读取Cars表之间被删除了。
Owners
我有几个问题:
我正在使用SQL Server 2005(在网络上)和SQL Server 2005 Express(在本地)。我可以同时显式地获取多个表的锁吗?
在我的本地数据库上,我无法阻止两次读取之间的修改。也就是说,一个线程会随机删除一个随机所有者(先是车,然后是书籍,然后是所有者),或者插入一个新所有者(插入所有者,插入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上,它可以正常工作,但是可能是由于连接速度较慢,因此降低了同时执行的可能性。
Select
目前,我无法判断我是否对事务隔离有误解,或者是SQL Server Express和SQL Server 2005之间存在差异的问题。我们将不胜感激。
您一次性加载所有数据的选择意味着很少的选择:
您有问题,因为SET TRANSACTION ISOLATION LEVEL SERIALIZABLE仅会影响锁的 隔离 :您需要控制 持续时间 (HOLDLOCK)和 粒度 + 模式 (TABLOCKX)
HOLDLOCK
TABLOCKX