在数据库C#中实现特定行的隔离

时间:2019-05-03 13:22:59

标签: c# transactions locking

我有一个应用程序,可以按顺序向用户发出信件。这是数据库结构

-------------------
UserID  LastIssued
-------------------
User1   2
User2   3
User3   0
User4   3
--------------------

管理员用户可以向用户发出字母(增加数字)。有多个管理员可以在系统中并行登录。

这是用来发出信件的功能

private void issueNewLetterToUser(String userid)
{
    int lastIssued;
    lastIssued = getLastIssuedForUserID(userid);
    //CHECKPPOINT1
    lastIssued++;
    updateLastIssuedForUserID(userid);
}

虽然执行是在代码中的检查点1进行的,但是假设另一个管理员为同一用户调用了相同的功能,则下一个字母将由两个管理员发出。我想防止这种情况。另外,如果函数调用是针对其他用户的,则应允许执行,因为数据库行是独立的。

我该如何实现? (该问题特定于C#语法,但仍适用于所有语言)

1 个答案:

答案 0 :(得分:0)

这是交易模式的绝佳案例。

这里有不错的读物:https://blog.matthewskelton.net/2005/08/22/better-transactions-with-delegates-in-csharp/

作为一种可能的解决方案,您可能希望在一个事务中更新数据,该事务一次只能由一个管理员访问。