Ami*_*har 5 sql-server-2008 deadlock transaction
我有一个系统将批量查询写入事务(以保持一致性),每个事务可以是 30-100 个查询集。这些是在多个表上完成的
同时使用内部选择对同一张表进行读取查询 - SELECT FROM table1... IN (SELECT from table 2...)
为了清楚起见 - 有一个写入事务的写入线程(每个事务写入所有表)和许多读取线程。
我收到死锁错误。1.死锁会不会跟IN选择有关?2. 如何让读取查询只提供已提交的数据,而不必等待当前事务提交(这意味着它可以返回先前提交的数据) 3. 死锁是否可能是由于事务花费太长时间而导致的完全的?
谢谢!
通过捕获 SQL Server Profiler 死锁图事件,而不是对可能负责的原因进行理论分析,而是准确地限定是什么。
如何使用 Profiler 追踪 SQL Server 中的死锁
一旦你知道你想要解决的问题是什么,你就可以继续实际解决它。
快照隔离 (SI) 是正确的方法。感谢@JohnSansom 和@EricHiggins 引导我了解这些信息。由于这可能是解决死锁的一种选择(因为它是非阻塞访问),我也会尝试修复死锁本身,但这是另一个问题
从这个页面:
快照隔离 (SI):这是新的专有隔离级别,可为读取操作提供非阻塞访问。SI 下的事务会看到截至事务开始时的数据库快照。事务隔离级别不会自动映射到 SI,因此您必须更改应用程序才能访问 SI 隔离级别下的数据。
- 优点: 对事务一致数据的非阻塞访问。比可重复读取更高的一致性。
- 缺点:维护行版本的一些开销。
- 用法: 在事务内的多个语句之间非阻塞地访问一致的数据。