当前位置: 首页 > 面试题库 >

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

东门宜
2023-03-14
问题内容

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

例如:

  • 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之间存在差异的问题。我们将不胜感激。


问题答案:

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

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

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



 类似资料:
  • 我正在尝试用Connector/J和MySql构建一个Java(JDK1.8)应用程序。有人告诉我,Serializable是最高级别,但它会影响性能,所以Serializable并不常用。 但是考虑一下这种情况: 有两个提交将更新同一行的字段(提交A和提交B)。如果A和B同时发生,并且隔离级别不可序列化,则会出现数据竞争,这会导致字段不一致。但在可序列化级别,这两个更新不会同时发生,因此A发生在

  • 我正在使用DAO进行事务管理。场景是创建包含quote_line和客户列表的新报价。如果客户不存在,它将把它插入表客户中。我的代码是如下架构: 在调试模式下,我只有两个变量:1-这(QuoteService)2-quote 这是th日志: 您可以注意到,消息“第44行删除”已打印,但没有从hibernate查询中删除的痕迹。 这段代码不起作用:使用customerDao和quoteLineDao的

  • MSDN 描述其 OLEDB 提供程序的 JET 事务隔离,如下所示: Jet支持事务中的五级嵌套。事务唯一支持的模式是提交读取。设置较低级别的事务分离意味着提交读取。设置更高的级别将导致StartTransaction失败。 Jet仅支持单相提交。 MSDN对的描述如下: 指定读取数据时保持共享锁,以避免脏读,但可以在事务结束前更改数据,从而导致不可重复读取或幻像数据。此选项是SQL服务器默认值

  • 主要内容:事务概述,事务的四大特性,并发事务问题,事务的隔离级别,演示:,总结事务概述 事务是一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行成功,要么全部执行失败。用于保证数据的完整性。 如账户转账,张三给李四转500,对应的sql语句应该是update张三的 余额-500,并且update李四的余额+500,如果先更新完张三的数据,然后出现了异常,导致李四的余额修改不了,那么就出现数据上的问题了,应该使用事务来解决这一问题,当中间出现异常后回滚,让张三的

  • 我已经阅读了大约4个级别的隔离: 我想了解每个事务隔离在表上使用的锁 以下是事务隔离中可能出现的三种现象 脏读取-无锁定 不可重复读取-无脏读取作为对提交数据的锁定 幻影读取-锁定sql块(使用select query选择) 我想了解我们在哪里定义这些隔离级别:仅在jdbc/hibernate级别或在DB中定义 PS:我已经浏览了oracle中隔离级别的链接,但是它们看起来很笨拙,而且只针对数据库

  • 问题内容: 我在单个SQL语句中从多个表中提取Sums时遇到问题。 我有三个表tblCases,tblTimesheetEntries和tblInvoices在tblCases和其他两个表之间存在一对多的关系。 我目前正在使用以下SQL语句 但是,这似乎重复了发票金额。例如,如果一个案例只有一张发票,但是说有4个时间表条目,则它将计算出发票金额的4倍作为该表的总和。 如果我将分组取出,然后运行以下