C# 当两个用户尝试连接时,谁获得访问的优先级?
如果两个用户连接到Access并运行检查最后一个数字的查询,请增加此数字并将记录插入数据库 谁得到优先权 为什么我看到两个相同编号的重复记录 他们都没有“优先权”。当你谈论非原子操作时,这不再是一个有用的术语。这里有一个例子可以说明这个问题 以下是您的脚本的外观:C# 当两个用户尝试连接时,谁获得访问的优先级?,c#,ms-access,C#,Ms Access,如果两个用户连接到Access并运行检查最后一个数字的查询,请增加此数字并将记录插入数据库 谁得到优先权 为什么我看到两个相同编号的重复记录 他们都没有“优先权”。当你谈论非原子操作时,这不再是一个有用的术语。这里有一个例子可以说明这个问题 以下是您的脚本的外观: 从数据库中读取值 增加1 将新值写入数据库 当一次只有一个人使用数据库时,这种方法有效。当不止一个人这样做时,事情就不起作用了。下面是现在发生的事情: 以DB表示的原始值为“100” 客户机A读作“100” 客户端A在本地将“1
- 从数据库中读取值
- 增加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关闭交易,并实际写入值
- 创建一个额外的ID表
- 创建一个存储过程,在其中
- 锁定对ID表的访问
- 读取当前值
- 递增并写回
- 解锁访问
- 返回递增的值
- 创建一个额外的ID表
- 创建一个存储过程,在其中
- 锁定对ID表的访问
- 读取当前值
- 递增并写回
- 解锁访问
- 返回递增的值
- 他们都没有“优先权”。当你谈论非原子操作时,这不再是一个有用的术语。这里有一个例子可以说明这个问题
以下是您的脚本的外观:
- 这是一个并发问题:
用户A和B都从数据库中读取当前值。然后A在客户端将其递增,并将其写回数据库,但B已经读取了该值,并且不知道递增的值。与A之前一样,B增加值并将其写回,用相同的数字覆盖A的更改
这种生成唯一数字的方法不安全。您应该让数据库使用自动增量值进行增量
或者,您可以使用以下构造:
创建ID表会阻止锁定数据表。这是一个并发问题: 用户A和B都从数据库中读取当前值。然后A在客户端将其递增,并将其写回数据库,但B已经读取了该值,并且不知道递增的值。与A之前一样,B增加值并将其写回,用相同的数字覆盖A的更改 这种生成唯一数字的方法不安全。您应该让数据库使用自动增量值进行增量 或者,您可以使用以下构造:
创建ID表会阻止锁定数据表。好吧,从问题的最后一个问题开始,您看到两条记录具有重复编号的原因是,您允许在架构/数据库/表设计中首先使用重复编号。从在数据库中添加约束和关系开始,您的场景将抛出一个错误,您可以从客户端开始使用乐观并发,和/或继续在数据库端生成唯一密钥和/或使用事务等。好的,从问题的最后一个问题开始,你看到dupli两张唱片的原因