我将每日日志保存在 MySQL 表中。我的应用程序尝试更新表中日期列等于今天的行;如果更新不影响任何行,则应用程序知道今天尚未创建行,因此它会插入一行。
我试图防止两个不同的线程最终插入今天的一行的情况。有没有什么方法可以做到这一点(即使用某种类型的锁定)来替代在日期列上设置唯一索引?
我看过像this one这样的线程,但我不太确定它会起作用 - 将其包装在事务中会阻止另一个线程也插入此行吗?我假设我真的需要一个隔离级别来防止幻像插入(例如可序列化)才能正常工作?
谢谢
最佳答案
我做了更多研究。默认情况下,InnoDB 事务似乎在 REPEATABLE READ 隔离级别下运行,该级别使用 next-key locks ,这应该 prevent the phantom insert problem 。所以,我相信只要将其包装在事务中,这个问题就应该在 InnoDB 中自动避免......任何人都可以为我确认这一点吗?
编辑 - 我发现如果 UPDATE 是 SELECT,我们必须使用 shared mode lock 。既然这是更新,那么在没有任何额外设置的情况下它是否仍然可以工作?
编辑2 - 为了在这种情况下进行下一个键锁定工作,日期列需要一个索引,对吗?
关于MySQL 防止重复插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24729046/