我想将记录插入到RDBMS表中,前提是该表不包含任何与所述行“相似”(根据某些特定的,不相关的标准)的行。我有一个简单的SELECT查询来检查是否存在任何“相似”行。
我最初认为要实现我的目标,只需在一个事务中一起运行有条件的SELECT查询,然后运行INSERT查询就足够了。但是,我一直在阅读不同的隔离级别,似乎在并发环境中,两个线程可能同时运行SELECT语句,并最终向表中插入“类似”行,即使SELECT + INSERT是在同一笔交易中。
第一个问题:我正在使用JPA(通过Hibernate)和MySQL数据库(使用InnoDB引擎用于我的所有表)。实现目标的最佳方法是什么?我显然宁愿保持标准,但如果需要,我愿意去当地。
第二个问题:假设我不介意用“类似”记录“覆盖”记录,并且我用DELETE替换SELECT语句 - 它会不会像我打算那样工作?基本上我在这里问的是,一个事务中的DELETE + INSERT是否是原子的,在某种意义上说,如果两个线程同时运行那些线程,那么无论它们如何运行,该表都不会包含两个插入的条目。交易完成了(一方面,如果它在这个意义上不是原子的,我真的会感到惊讶,但另一方面,它似乎强制表锁,不是吗?)。
感谢您的帮助!