【问题标题】:race condition in logic for database数据库逻辑中的竞争条件
【发布时间】:2013-08-12 02:19:27
【问题描述】:

我有一个数据库服务器。

应用程序的逻辑是它会查询是否存在特定的行,如果不存在,它将插入一个新行。查询在 Java 和容器管理事务中完成。

因此,如果有 2 个应用程序服务器运行相同的代码,那么两个服务器是否可以检查该行不存在,并且都插入该行。 (由于另一个唯一的自动编号主键列,插入将成功)

我们如何确保该数据只有一个且只有一个唯一行?

斯奈特

【问题讨论】:

  • 我喜欢处理这种事情的方式是在您希望唯一的列(或列组)上创建一个 UNIQUE 约束。不要检查是否存在,只是总是尝试插入具有指定数据的行,并在您的业务逻辑中捕获任何异常(由数据库引擎抛出)。这是处理此类竞争条件的唯一真正方法

标签: database race-condition


【解决方案1】:

由于另一个唯一的自动编号主键列,插入将成功

大多数 DBMS 都提供了一种创建“唯一键”或“唯一索引”的方法,即使它不是主键,也可以强制指定列(或一组列)的唯一性。然后第二次插入将失败,就像它违反了主键约束一样。

您尚未指明您使用的是什么 DBMS,但大多数(全部?)常见的 DBMS 都具有此功能;例如,PostgreSQL、MySQL、SQL Server 和 Oracle 都可以。

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2016-03-07
    • 2011-07-17
    相关资源
    最近更新 更多