【发布时间】:2019-04-23 03:37:46
【问题描述】:
我有四个表叫:
- 参与者[列:ID、姓名]
- Answer [Columns:Id, Question_id(问题表的外键),Option_Id(选项表的外键),Participant_Id(参与者表的外键)]。
- 问题 [ID,标题]
- 选项 [Id、title、question_id(问题表的 FK)]。
参与者、问题和选项记录已由管理员创建,现在,当参与者回答问题时,我们每隔几秒保存一次(参与者可以回答新问题或从已回答的问题中删除答案)。
现在在保存最新答案时,我们会删除当前参与者的现有答案并插入最新答案。
现在可能会有 2 个线程来为同一参与者保存答案,因此两者都会尝试删除答案然后插入。如果两个线程同时删除然后尝试插入它会导致竞争条件并且重复的答案将被保存。
更多细节:
- 当前参与者有 4 个现有答案。
- 线程 1 和线程 2 来保存 6 和 7 的答案记录。
- 主题 1:已删除答案(已删除 4 个答案)。
- 线程 2:删除答案(已删除 0 个答案,因为线程 1 已删除)
- 主题 1:插入最新的 6 个答案。
- 线程 2:插入最新的 7 个答案。
这里当前参与者将有 6+7 = 13 个答案,这是错误的,应该是 6 或 7。
如何通过交易或任何更好的方法来处理这个问题?我不想使用java线程锁,也不想锁定整个表。
在执行删除/插入操作时如何锁定 Answer 表的参与者 ID,以便其他事务在尝试使用相同的参与者 ID 插入/更新/删除时必须等待?寻找性能最佳的解决方案。
我正在使用 Postgres SQL 和 JPA。如果需要,我已准备好使用普通 SQL 进行删除和插入。
【问题讨论】:
标签: postgresql concurrency transactions race-condition