我有一个像(id INTEGER, sometext VARCHAR(255), ....)
这样的表,其中id
为主键,sometext
为UNIQUE约束。它在Web服务器中使用,其中请求需要找到与给定id
对应的sometext
(如果存在),否则将插入新行。
这是此表上的唯一操作。此表上没有更新,也没有其他操作。其唯一目的是持续数量的sometext
遇到的值。这意味着我无法删除id
并使用sometext
作为PK。
我执行以下操作:
sometext
查找行。通常,这是有效的,我已经完成了。这种方法很好,除非有两个重叠请求具有相同的sometext
。然后是ConstraintViolationException
结果。我需要INSERT IGNORE
或INSERT ... ON DUPLICATE KEY UPDATE
(Mysql语法)或MERGE(Firebird语法)之类的东西。
我想知道有什么选择?
AFAIK Hibernate merge
仅适用于PK,因此不合适。我想,本机查询可能有所帮助,因为在第二次INSERT发生时它可能会也可能不会被提交。
答案 0 :(得分:2)
让数据库处理并发。仅用于插入新行的二级事务。如果它因ConstraintViolationException而失败,只需回滚该事务并读取新行。
答案 1 :(得分:1)
如果重复的可能性很高,不确定这会很好地扩展,如果事务的某些百分比(取决于数据库)必须使插入失败然后重新选择,那么很多额外的工作。
辅助事务最小化了添加新文本的事务所花费的时间,假设数据库正确支持它,则线程1事务可能导致线程2选择/插入挂起直到线程1事务已提交或回滚。整体数据库设计也可能影响事务吞吐量。
我不一定质疑为什么某些文字不能成为PK,想知道为什么你需要打破它。当然,如果某些文本记录很大,大量可能会大大节省空间,看起来您似乎正在尝试模拟lucene索引来为您提供完整的文本值列表。