开发者社区> 问答> 正文

基于选择结果的基本锁定

我有一个修改数据库的简单程序,该数据库也可能由不同的用户并发运行。

在程序中,我有一些顺序的操作读取/更新/插入数据库,这些操作相互依赖。

例如:

String selectQuery = "select order.[total] from order where id=?";
selectQuery.setString(1, "15679");

ResultSet queryResults = selectQuery.executeQuery();

if(queryResults.next() == false){

    //execute insert into the order table
    String insertQuery = "insert into order (id, total) values (?,?)";
    .......

}

现在,在上面的示例中,不能保证两个程序不会尝试同时插入订单,因为它们都可以执行选择,获取空结果集然后尝试插入。

我知道在此示例中,这有点不现实,因为我们可以在id列上强制执行唯一性,这将阻止插入重复项。

我正在尝试做的是确保可以避免这种情况而不必锁定整个表?因此,我们可以保证在执行select查询之前,我们可以知道该行(可能存在或可能不存在)上没有插入/更新/读取。之后,我们可以释放该行上的锁。

展开
收起
祖安文状元 2020-01-05 14:36:02 403 0
1 条回答
写回答
取消 提交回答
  • 好吧,您似乎了解竞争条件以及为什么不想在应用程序中进行检查。

    因此,请确保中的id唯一orders:

    alter table orders add constraint unq_orders_id unique (id);
    
    

    您可以尝试任意数量的并发插入。除了一个之外,其他所有都将失败,因为数据库正在确保关系完整性。

    2020-01-05 14:36:12
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载