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

使用IsolationLevel.Snapshot,但数据库仍处于锁定状态

宇文学博
2023-03-14
问题内容

我是构建基于ADO.NET的网站的团队的一部分。有时我们有几个开发人员和一个自动化测试工具,它们同时在开发数据库的副本。

我们使用快照隔离级别,据我所知,它使用乐观并发性:它不是锁定,而是希望达到最佳状态,并且如果在受影响的行已在另一方更改期间尝试提交事务,则它会抛出异常交易。

要使用快照隔离级别,我们使用:

ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;

并在C#中:

Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);

请注意,IsolationLevel Snapshot与ReadCommitted Snapshot不同,我们也曾尝试使用它,但当前未使用它。

当开发人员之一进入调试模式并暂停.NET应用程序时,他们将在调试时保持与活动事务的连接。现在,我希望这不会成为问题-
毕竟,所有事务都使用快照隔离级别,因此,在暂停一个事务的同时,其他事务应该能够正常进行,因为暂停的事务没有任何锁。当然,当暂停的事务完成时,很可能会检测到冲突。但这是可以接受的,只要其他开发人员和自动化测试可以不受阻碍地进行即可。

但是,实际上,当一个人在调试时暂停事务时,尽管使用快照隔离级别,所有试图访问同一行的其他DB用户也会被阻止。

有谁知道为什么会这样,和/或我如何实现真正的乐观(非阻塞)并发?


问题答案:

像所有隔离级别一样,SNAPSHOT隔离级别只会影响读取。写入仍然相互阻塞。如果您认为看到的是读取块,则应该进一步调查并检查发生阻塞的资源类型和资源名称(sys.dm_exec_requests中的wait_type和wait_resource )。

我不建议进行代码更改以支持涉及开发人员最后几分钟盯着调试器的情况。如果您认为这种情况会在生产中重复出现(即客户挂起),那就是另一回事了。要实现所需的功能,必须在事务返回之前一次提交并在返回之前提交的事务中,最小化写操作并在事务结束时执行所有写操作。这样,任何客户端都无法长时间持有X锁(持有X锁时无法挂起)。在实践中,这很难实现,并且要求开发人员在编写数据访问代码的方式方面进行大量训练。



 类似资料:
  • 我们在库伯内特斯部署了自卫队。从SCDF UI中,我们可以使用基于Docker的源处理器创建流 应用程序日志显示Tomcat没有初始化,因为没有暴露哪些/执行器endpoint 对问题可能是什么以及如何解决有什么想法吗? SCDF日志 Skipper日志

  • 问题内容: 我在我的应用程序中做了一些重复的操作(测试),突然我收到一个奇怪的错误: 我已经重新启动服务器,但是错误仍然存​​在。可能是什么呢? 问题答案: 从Django文档中: SQLite是一个轻量级的数据库,因此不支持高级别的并发性。OperationalError:数据库已锁定错误,表明你的应用程序并发性超过sqlite在默认配置下无法处理的并发性。此错误意味着一个线程或进程在数据库连接

  • 我遵循grails文档,它说要做悲观锁定,我可以这样做: 所以这会锁定计划实例,直到保存完成。现在在我的例子中,我想一次锁定多个计划,如下所示: 我在默认情况下是事务性的 grails 服务中执行此操作,但上述行没有按预期工作。它不会锁定所有行,并在执行并发事务时引发。 如何在阅读时锁定多行? 有关更多信息,请参见相关问题:grails中的并发事务导致数据库陈旧状态异常

  • 谷歌已经使IAB测试变得更加简单,当我测试每月订阅时,会运行5分钟,然后我收到Play Store的邮件: 你的订阅自。。。谷歌的游戏已经取消。 但是当通过Play Store API查询库存/购买时,我仍然会得到 “购买状态”: 0 意思是“好的”。我已经等了一天了——可能它不能立即工作——但它仍然停留在0/OK。我做错了什么吗?

  • 本文向大家介绍InnoDB数据库死锁问题处理,包括了InnoDB数据库死锁问题处理的使用技巧和注意事项,需要的朋友参考一下 场景描述 在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction...)。 问题分析 这个异常并不会

  • 我有一个关于Kubernetes环境的问题。我有K8s云,在我添加了一个持久卷分配给一个豆荚后,这个豆荚仍然处于“容器创建”状态。此PV已正确分配PVC。PVC与副本2一起位于两个外部GlusterFS服务器上。 你有什么想法可能是错的吗?我在哪里可以找到详细的日志?提前THX。 编辑:Gluster mount正确地安装在Master上,如果我手动添加任何文件,它将正确地复制到两个Gluster