我们可以通过为不同的进程创建不同的数据库用户来避免死锁吗
e.g。一个用户与API'ABC'进行通信,一个用户与API'PQR'和其他用户进行通信,处理系统数据由API'ABC'和'PQR'提供?所有这些用户都将处理相同的表格。
答案 0 :(得分:2)
死锁发生的原因是不同的会话争用相同的资源(表,索引,行等),SQL服务器不关心谁是会话的所有者,它可以是具有多个会话或多个用户的相同用户。因此,仅为了避免死锁而创建多个用户并没有帮助。
可以帮助的事情......
答案 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的情况,他们都在等待对方完成,但他们都不能。为不同的进程创建不同的用户可以防止死锁,但它并不真实。
正常的方法/最佳实践只是将系统编程为使用锁,以便在实体访问事务时以特定顺序锁定事务。这可以防止任何事务陷入死锁情况,并且如果一个事务正在使用数据,另一个尝试访问同一块的另一个将被迫等待另一个完成,然后才能继续。
答案 3 :(得分:0)
它可能不适用于所有情况,但我们尝试在存储过程中处理处理逻辑并使用' sp_getapplock'防止程序事务同时使用。
答案 4 :(得分:0)