我有一个应用程序,可以按顺序向用户发出信件。这是数据库结构
-------------------
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#语法,但仍适用于所有语言)
答案 0 :(得分:0)
这是交易模式的绝佳案例。
这里有不错的读物:https://blog.matthewskelton.net/2005/08/22/better-transactions-with-delegates-in-csharp/
作为一种可能的解决方案,您可能希望在一个事务中更新数据,该事务一次只能由一个管理员访问。