在一般情况下,零死锁基本上是一个代价高昂的问题,因为您必须知道要为每个正在运行的事务(包括 SELECT)读取和修改的所有表/对象。一般哲学称为有序严格两阶段锁定(不要与两阶段提交混淆)(http://en.wikipedia.org/wiki/Two_phase_locking;即使 2PL 也不能保证没有死锁)
很少有 DBMS 真正实施严格的 2PL,因为这样的事情会导致巨大的性能损失(没有免费的午餐),而您的所有事务都在等待执行甚至是简单的 SELECT 语句。
无论如何,如果这是您真正感兴趣的东西,请查看SET ISOLATION LEVEL
SQL Server。您可以根据需要进行调整。http://en.wikipedia.org/wiki/Isolation_level
有关更多信息,请参阅关于 Serializability 的维基百科:http ://en.wikipedia.org/wiki/Serializability
也就是说——一个很好的类比就像源代码修订:尽早并经常检查。让您的事务保持小(以 SQL 语句数、修改的行数为单位)和快速(挂钟时间有助于避免与其他人发生冲突)。在一个事务中做很多事情可能会很好而且很整洁——总的来说我同意这个哲学——但是如果你遇到很多死锁,你可以把事务分解成更小的事务,然后在您移动时检查他们在应用程序中的状态。TRAN 1 - OK Y/N?如果是,发送 TRAN 2 - OK Y/N? 等等等等
顺便说一句,在我作为一名 DBA 和开发人员(测量数千个并发用户的多用户 DB 应用程序)的多年中,我从未发现死锁是一个如此严重的问题,以至于我需要特别注意它(或改变隔离)水平无忧无虑等)。