Sql server 如何使用ruby/sequel/tinytds避免基于docker的sql server死锁?
我正在从事一个服务器端rails ish项目,该项目支持配置您选择的数据库,到目前为止,您的选择是MySql和PostgreSQL。我们正在尝试支持MS SQL Server。如果我们使用他们的docker容器(),就会立即出现死锁,很可能是由于调用某种同步引起的 我在上找到了Jeff Atwood关于使用Sql server 如何使用ruby/sequel/tinytds避免基于docker的sql server死锁?,sql-server,ruby,deadlock,sequel,tiny-tds,Sql Server,Ruby,Deadlock,Sequel,Tiny Tds,我正在从事一个服务器端rails ish项目,该项目支持配置您选择的数据库,到目前为止,您的选择是MySql和PostgreSQL。我们正在尝试支持MS SQL Server。如果我们使用他们的docker容器(),就会立即出现死锁,很可能是由于调用某种同步引起的 我在上找到了Jeff Atwood关于使用nolock修饰符解决SQL Server死锁的文章,但我没有找到一种方法将其作为Sequel连接字符串的选项(“Sequel”是Ruby ORM,而不是MS产品), 而且在任何情况下,Seq
nolock
修饰符解决SQL Server死锁的文章,但我没有找到一种方法将其作为Sequel
连接字符串的选项(“Sequel”是Ruby ORM,而不是MS产品),
而且在任何情况下,Sequel ORM和tinytds SQL Server适配器的相互作用似乎总是通过synchronize
当我们在Azure box上以本机形式运行sql server时,我们不会立即死锁,但最终会死锁,就像在运行两个小时的测试过程中一样。错误消息表示要再次运行该命令,但考虑到我们使用的是ORM,这可能发生在代码中的任何地方(我在回溯中看到的一点只是获取表中的行数),因此retry
不是一个很好的解决方案
还有其他人碰到过这个吗?有人有解决方案吗?我会公开说“在所有查询上抛出
nolock
并不是避免死锁的好策略”。您能提供死锁xml进行分析吗?首先,我不能添加'nolock',因为我们使用的是一个抽象底层SQL的ORM。这只是一堆ruby电话,比如销售人员。where(姓名:“J B Briggs”,月份:“Feb”)。update(“commission”,100)。save
没有机会做nolock
。死锁xml会在哪里?理解。我想说的是,即使你能遵循这个指导,也有很多不好的原因。至于死锁图,如果您使用的是SQL 2008或更高版本,那么您应该能够设置一个扩展事件会话来捕获它。