我有一个修改数据库的简单程序,该数据库也可能由不同的用户并发运行。
在程序中,我有一些顺序的操作读取/更新/插入数据库,这些操作相互依赖。
例如:
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查询之前,我们可以知道该行(可能存在或可能不存在)上没有插入/更新/读取。之后,我们可以释放该行上的锁。
好吧,您似乎了解竞争条件以及为什么不想在应用程序中进行检查。
因此,请确保中的id唯一orders:
alter table orders add constraint unq_orders_id unique (id);
您可以尝试任意数量的并发插入。除了一个之外,其他所有都将失败,因为数据库正在确保关系完整性。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。