C# 使用c并发用户读取和更新mysql#
我的程序有一个问题,通过解决这个问题,也许可以用单例方法来完成。但是,我读了一些文章,他们说,这不是一个好的实现方法,因为asp.net应用程序并发用户可能有很多 我的问题是,系统运行编号基于数据库示例中的特定记录:C# 使用c并发用户读取和更新mysql#,c#,mysql,singleton,record-locking,C#,Mysql,Singleton,Record Locking,我的程序有一个问题,通过解决这个问题,也许可以用单例方法来完成。但是,我读了一些文章,他们说,这不是一个好的实现方法,因为asp.net应用程序并发用户可能有很多 我的问题是,系统运行编号基于数据库示例中的特定记录: 单据类型=“库存”,单据年份=2015,单据月份=04,单据运行=0102 单据类型=“库存”,单据年份=2015,单据月份=05,单据运行=0002 因此,当用户创建新记录时,获取新运行编号的逻辑如下: 获取单据类型=“inv”、本年、本月 如果没有找到。创建运行编号为000
- 单据类型=“库存”,单据年份=2015,单据月份=04,单据运行=0102
- 单据类型=“库存”,单据年份=2015,单据月份=05,单据运行=0002
MH最简单的方法是对文档运行字段使用自动递增,以接近所需的效果: 警告:请注意,在这种情况下,您运行的文档在所有文档中总是唯一的,而不仅仅是相同类型/年/月的记录 替代解决方案:
使用GUID作为文档运行字段。同样的警告也适用。我看到的唯一方法是对正在调用的方法使用锁来进行数据库管理
public class Dal
{
private static object syncObject = new object();
public static void InsertUpdate(...)
{
lock (syncObject)
{
// 1. Get the document type = "inv" , current year and current month,
// 2. If not found. create a new document type , year and month record with the running number 0001.
// 3. if found. running + 1.
}
}
}
你能展示一些你正在使用的现有代码和/或逻辑吗。。这个逻辑是在数据库上还是在C代码中完成的。。?听起来您在save逻辑中做了一些不正确的事情,但我怀疑是否有人能够准确地回答这个问题,因为您没有提供任何代码。@MethodMan实际上没有任何复杂的代码,它只是一个简单的逻辑,但在同时访问多个用户时会出现问题。逻辑是每个用户接收行信息并在asp.net中执行增量逻辑,然后当更新回数据库时,其他并发用户可能已经拥有旧信息并执行相同的增量逻辑。您好,感谢您的回复。是不是有点像单身汉?我觉得这就是我想要的。不管怎样,都会做一个测试。这里没有单例,但只是一个避免并发的常用方法:-)好的,谢谢,我有这个数据库的数据访问层,但是,我读取它存储在内存中,并根据我的逻辑修改后,然后再次调用这个数据访问层进行更新。这是另一个事务,它将等待此锁被释放,还是将旁路?调用该方法的第一个调用方将获取该锁,而任何其他调用方将等待,直到该锁被释放,然后提供服务。