如何在sql

时间:2017-09-14 08:02:20

标签: sql sql-server

我们可以通过为不同的进程创建不同的数据库用户来避免死锁吗

e.g。一个用户与API'ABC'进行通信,一个用户与API'PQR'和其他用户进行通信,处理系统数据由API'ABC'和'PQR'提供?所有这些用户都将处理相同的表格。

5 个答案:

答案 0 :(得分:2)

死锁发生的原因是不同的会话争用相同的资源(表,索引,行等),SQL服务器不关心谁是会话的所有者,它可以是具有多个会话或多个用户的相同用户。因此,仅为了避免死锁而创建多个用户并没有帮助。

可以帮助的事情......

  1. 以相同的顺序访问对象。
  2. 避免交易中的用户互动。
  3. 保持交易简短且一批。
  4. 使用较低的隔离级别(小心)。
  5. 使用基于行版本控制的隔离级别。
  6. 将READ_COMMITTED_SNAPSHOT数据库选项设置为ON以启用读取提交的事务以使用行版本控制。
  7. 如果可能的话,使用快照隔离(请注意它会破坏你的tempdb)。
  8. 看看这个Minimizing Deadlocks

答案 1 :(得分:0)

就个人而言,您可以向表中添加timestamp列,以便在多个用户同时更新行时帮助维护数据库的完整性。您可能还想知道在不重新查询表的情况下更新了多少行和哪些行。

CREATE TABLE MyTest (myKey int PRIMARY KEY, myValue int, RV rowversion);  

然后,您可以使用以下示例Transact-SQL语句在更新期间在[table-name]表上实现乐观并发控制。

DECLARE @t TABLE (myKey int);  
UPDATE MyTest  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND RV = [row-version-value];  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

答案 2 :(得分:0)

我想这可以防止死锁,因为你会有不同的用户访问不同的进程,但这不会真正解决死锁问题。死锁是更多的地方,2个实体正在访问同一条数据/数据被阻止,然后没有人可以完成交易。它更像是一个捕获22的情况,他们都在等待对方完成,但他们都不能。为不同的进程创建不同的用户可以防止死锁,但它并不真实。

Deadlock

正常的方法/最佳实践只是将系统编程为使用锁,以便在实体访问事务时以特定顺序锁定事务。这可以防止任何事务陷入死锁情况,并且如果一个事务正在使用数据,另一个尝试访问同一块的另一个将被迫等待另一个完成,然后才能继续。

答案 3 :(得分:0)

它可能不适用于所有情况,但我们尝试在存储过程中处理处理逻辑并使用' sp_getapplock'防止程序事务同时使用。

答案 4 :(得分:0)

不,首先找到死锁受害者看看article。在大多数情况下,它缺乏索引或糟糕的索引会导致死锁......

如果您可以发布死锁详情,我们可以提出最佳解决方案。

根据您的要求,最好设置priority以避免死锁。