MySQL 防止重复插入

标签 mysql insert locking

我将每日日志保存在 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/

相关文章:

mysql - Hibernate 查询语法错误

linux - 在 Linux 中锁定串行端口和其他设备的最佳做法是什么?

MySQL总和排名,按流派分组,限制10

php - DATE_FORMAT 省略秒

mysql - 如何打印不包含ID或不包含id列的表名称?

c++ - 在二叉树中向左或向右随机插入

创建具有 2 个外键作为主键的表时 MySQL 语法错误

php - 插入时出现奇怪的 Mysql 问题

sql-server - 在 SQL Server 中获取帐户 'locked' 状态

mysql - 是否可以为 MYSQL 中的特定用户设置 TRANSACTION ISOLATION LEVEL READ UNCOMMITTED