Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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#_Ms Access - Fatal编程技术网

C# 当两个用户尝试连接时,谁获得访问的优先级?

C# 当两个用户尝试连接时,谁获得访问的优先级?,c#,ms-access,C#,Ms Access,如果两个用户连接到Access并运行检查最后一个数字的查询,请增加此数字并将记录插入数据库 谁得到优先权 为什么我看到两个相同编号的重复记录 他们都没有“优先权”。当你谈论非原子操作时,这不再是一个有用的术语。这里有一个例子可以说明这个问题 以下是您的脚本的外观: 从数据库中读取值 增加1 将新值写入数据库 当一次只有一个人使用数据库时,这种方法有效。当不止一个人这样做时,事情就不起作用了。下面是现在发生的事情: 以DB表示的原始值为“100” 客户机A读作“100” 客户端A在本地将“1

如果两个用户连接到Access并运行检查最后一个数字的查询,请增加此数字并将记录插入数据库

谁得到优先权

为什么我看到两个相同编号的重复记录

他们都没有“优先权”。当你谈论非原子操作时,这不再是一个有用的术语。这里有一个例子可以说明这个问题

以下是您的脚本的外观:

  • 从数据库中读取值
  • 增加1
  • 将新值写入数据库
当一次只有一个人使用数据库时,这种方法有效。当不止一个人这样做时,事情就不起作用了。下面是现在发生的事情:

  • 以DB表示的原始值为“100”
  • 客户机A读作“100”
  • 客户端A在本地将“100”增加到“101”,但尚未写入
  • 客户B读作“100”
  • 客户端B在本地将“100”增加到“101”,但尚未写入
  • 客户机A写“101”
  • 客户端B写“101”
这称为竞争条件,发生这种情况是因为您没有使用。对于事务,以下是可能发生的情况:

  • 以DB表示的原始值为“100”
  • 客户机A根据此值开始事务处理
  • 客户机A读作“100”
  • 客户端A在本地将“100”增加到“101”,但尚未写入
  • 客户端B试图开始一个事务,但已经有一个挂起的事务,因此它还不能启动
  • 客户机A写“101”
  • 客户端A关闭事务,并实际写入值
  • 客户机B根据该值开始交易
  • 客户机B读作“101”
  • 客户端B在本地将“101”增加到“102”,但尚未写入
  • 客户B写“102”
  • 客户B关闭交易,并实际写入值
    • 他们都没有“优先权”。当你谈论非原子操作时,这不再是一个有用的术语。这里有一个例子可以说明这个问题

      以下是您的脚本的外观:

      • 从数据库中读取值
      • 增加1
      • 将新值写入数据库
      当一次只有一个人使用数据库时,这种方法有效。当不止一个人这样做时,事情就不起作用了。下面是现在发生的事情:

      • 以DB表示的原始值为“100”
      • 客户机A读作“100”
      • 客户端A在本地将“100”增加到“101”,但尚未写入
      • 客户B读作“100”
      • 客户端B在本地将“100”增加到“101”,但尚未写入
      • 客户机A写“101”
      • 客户端B写“101”
      这称为竞争条件,发生这种情况是因为您没有使用。对于事务,以下是可能发生的情况:

      • 以DB表示的原始值为“100”
      • 客户机A根据此值开始事务处理
      • 客户机A读作“100”
      • 客户端A在本地将“100”增加到“101”,但尚未写入
      • 客户端B试图开始一个事务,但已经有一个挂起的事务,因此它还不能启动
      • 客户机A写“101”
      • 客户端A关闭事务,并实际写入值
      • 客户机B根据该值开始交易
      • 客户机B读作“101”
      • 客户端B在本地将“101”增加到“102”,但尚未写入
      • 客户B写“102”
      • 客户B关闭交易,并实际写入值

        • 这是一个并发问题:

          用户A和B都从数据库中读取当前值。然后A在客户端将其递增,并将其写回数据库,但B已经读取了该值,并且不知道递增的值。与A之前一样,B增加值并将其写回,用相同的数字覆盖A的更改

          这种生成唯一数字的方法不安全。您应该让数据库使用自动增量值进行增量

          或者,您可以使用以下构造:

          • 创建一个额外的ID表
          • 创建一个存储过程,在其中
            • 锁定对ID表的访问
            • 读取当前值
            • 递增并写回
            • 解锁访问
            • 返回递增的值

          创建ID表会阻止锁定数据表。

          这是一个并发问题:

          用户A和B都从数据库中读取当前值。然后A在客户端将其递增,并将其写回数据库,但B已经读取了该值,并且不知道递增的值。与A之前一样,B增加值并将其写回,用相同的数字覆盖A的更改

          这种生成唯一数字的方法不安全。您应该让数据库使用自动增量值进行增量

          或者,您可以使用以下构造:

          • 创建一个额外的ID表
          • 创建一个存储过程,在其中
            • 锁定对ID表的访问
            • 读取当前值
            • 递增并写回
            • 解锁访问
            • 返回递增的值

          创建ID表会阻止锁定数据表。

          好吧,从问题的最后一个问题开始,您看到两条记录具有重复编号的原因是,您允许在架构/数据库/表设计中首先使用重复编号。从在数据库中添加约束和关系开始,您的场景将抛出一个错误,您可以从客户端开始使用乐观并发,和/或继续在数据库端生成唯一密钥和/或使用事务等。

          好的,从问题的最后一个问题开始,你看到dupli两张唱片的原因