sql - 死锁:插入与从多个表中选择。快照隔离?

在我的数据库中,我有两个密切相关的表。 有一个经常调用的 SP,它在一个事务中将一些行插入到两个表中,以及从这些连接的表中执行 SELECT 的其他几个地方。

INSERT 对两个表都采用 X 锁,SELECT 对它们采用 S 或 IS 锁。由于获取共享锁的顺序因查询而异,因此其中一些偶尔会因 INSERT 事务而死锁。

有没有什么好的方法可以避免这些死锁(NOLOCK 可能不符合“好”条件)?

到目前为止,我能想到的唯一通用解决方案是使用 SNAPSHOT 隔离级别。但是,它会增加一些性能开销,而且我还没有找到任何关于这种开销有多大的可靠数据。

最佳答案

我在我的系统中使用快照。它不是免费的,这是肯定的,但替代品也不是免费的——阻塞也会占用资源。使用行锁并不总是有帮助。 快照还为您提供一致的数据时间点快照;否则你会暴露在一些微妙的错误中。

还有一件事:即使只有一张表,也可能会出现死锁,示例如下:Reproducing deadlocks involving only one table

https://stackoverflow.com/questions/6382979/

相关文章:

python - 如何使用 tripit API 制作独立工具?

matlab - 从 MATLAB GUI 中发送 SIGINT

makefile - 规范 'simple project' 生成文件

winforms - 更新 ClickOnce 应用程序

svn - 对于 SVN/Tortoisesvn,如何只显示文件夹属性的日志,即不显示文件夹的内容?

asp.net - 如何从使用 URL 路由的 ASP.NET 站点上的 URL 中删除参数?

python - 如何在 Mayavi2/VTK 中为绘图添加比例尺?

facebook - 如何在 Facebook 上为我的应用程序上传没有黑色颗粒状边框的图标?

domain-driven-design - 如何更新聚合内的实体

php - PHP 中的静态类是不好的做法吗?