【问题标题】:MariaDB multiple identical row even when using REPEATABLE READ transaction即使使用 REPEATABLE READ 事务,MariaDB 也有多个相同的行
【发布时间】:2017-10-06 06:30:55
【问题描述】:

我有一个带有 MariaDB 服务器的 nodejs Web 服务,并且我的应用中有大约 500 个每日活跃用户。

在我的代码中,我使用如下事务:

START TRANSACTION

-- select to find out the existence of a row --
-- if the row doesn't exist, a new row inserted --

COMMIT

此事务应该不会插入重复的行,但事实并非如此。
我认为这发生在具有不同会话的 2 个请求同时到达并看到该行不存在然后两个会话都插入它时。

MariaDB 事务隔离级别是 REPEATABLE-READ。

这是因为 REPEATABLE READ 隔离级别吗?

当另一个会话可能读取同一行时,如何独占锁定读取和写入?

【问题讨论】:

    标签: transactions locking mariadb isolation-level


    【解决方案1】:

    相反,执行其中一个,其中任何一个都是“原子的”并且不需要BEGIN/COMMIT,除非存在属于同一事务的其他语句:

    INSERT IGNORE ...;
    
    INSERT ... ON DUPLICATE KEY UPDATE ...;
    

    解释我们的代码有什么问题:您应该在SELECT 上有FOR UPDATE

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 1970-01-01
      • 2013-12-22
      • 2019-04-16
      • 1970-01-01
      • 2012-01-07
      • 2018-11-06
      • 2011-02-13
      • 2018-06-30
      相关资源
      最近更新 更多