Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c并发用户读取和更新mysql#_C#_Mysql_Singleton_Record Locking - Fatal编程技术网

C# 使用c并发用户读取和更新mysql#

C# 使用c并发用户读取和更新mysql#,c#,mysql,singleton,record-locking,C#,Mysql,Singleton,Record Locking,我的程序有一个问题,通过解决这个问题,也许可以用单例方法来完成。但是,我读了一些文章,他们说,这不是一个好的实现方法,因为asp.net应用程序并发用户可能有很多 我的问题是,系统运行编号基于数据库示例中的特定记录: 单据类型=“库存”,单据年份=2015,单据月份=04,单据运行=0102 单据类型=“库存”,单据年份=2015,单据月份=05,单据运行=0002 因此,当用户创建新记录时,获取新运行编号的逻辑如下: 获取单据类型=“inv”、本年、本月 如果没有找到。创建运行编号为000

我的程序有一个问题,通过解决这个问题,也许可以用单例方法来完成。但是,我读了一些文章,他们说,这不是一个好的实现方法,因为asp.net应用程序并发用户可能有很多

我的问题是,系统运行编号基于数据库示例中的特定记录:

  • 单据类型=“库存”,单据年份=2015,单据月份=04,单据运行=0102
  • 单据类型=“库存”,单据年份=2015,单据月份=05,单据运行=0002
因此,当用户创建新记录时,获取新运行编号的逻辑如下:

  • 获取单据类型=“inv”、本年、本月
  • 如果没有找到。创建运行编号为0001的新文档类型、年和月记录
  • 如果找到的话。跑步+1
  • 现在,问题出来了。我的情况是5个用户收到了记录信息 当他们按下“保存”按钮创建新记录时: -单据类型=“库存”,单据年份=2015,单据月份=05,单据运行=0002

    5个用户获得相同的运行编号INV15-05-0003(在0002+1之后)。 右边应该是INV15-05-0003、INV15-05-0004、INV15-05-0005、INV15-05-0006和INV15-05-0007

    我们应该如何避免所有用户获得错误/过时的信息。 希望你们都能理解我糟糕的英语。 当做
    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中执行增量逻辑,然后当更新回数据库时,其他并发用户可能已经拥有旧信息并执行相同的增量逻辑。您好,感谢您的回复。是不是有点像单身汉?我觉得这就是我想要的。不管怎样,都会做一个测试。这里没有单例,但只是一个避免并发的常用方法:-)好的,谢谢,我有这个数据库的数据访问层,但是,我读取它存储在内存中,并根据我的逻辑修改后,然后再次调用这个数据访问层进行更新。这是另一个事务,它将等待此锁被释放,还是将旁路?调用该方法的第一个调用方将获取该锁,而任何其他调用方将等待,直到该锁被释放,然后提供服务。