我将每日日志保存在MySQL表中。我的应用尝试更新表格中日期列等于今天的行;如果UPDATE没有影响任何行,那么应用程序知道今天尚未生成一行,因此它会插入一行。
我试图阻止两个不同线程最终为今天插入一行的情况。有没有办法做到这一点(即使用某种类型的锁定),可以替代在日期列上设置唯一索引?
我查看了this one之类的线程,但我不确定它是否会起作用 - 将这个包装在一个事务中会阻止另一个线程插入这一行吗?我假设我真的需要一个可以防止幻像插入的隔离级别,比如可序列化的,这样可以使用吗?
由于
答案 0 :(得分:0)
我做了更多的研究。默认情况下,InnoDB事务似乎在REPEATABLE READ隔离级别中运行,该隔离级别使用next-key locks,prevent the phantom insert problem应该shared mode lock。所以,我相信只是通过在交易中包装这个问题,应该在InnoDB中自动避免这个问题......任何人都可以为我确认这个吗?
编辑 - 我看到如果UPDATE是SELECT,我们必须使用{{3}}。由于这是一个更新,它是否仍然可以在没有任何额外设置的情况下工作?
EDIT2 - 为了让这个场景具有下一键锁定功能,日期列需要一个索引,对吗?