首页 文章

Mariadb SELECT没有锁定失败

提问于
浏览
0

我试图导致'SELECT'查询失败,如果它试图读取的记录被锁定 .
为了模拟它,我在UPDATE上添加了一个触发器,它休眠20秒然后在一个线程(Java应用程序)中我正在更新记录(oid = 53),而在另一个线程中我正在执行以下查询:

“SET STATEMENT max_statement_time = 1 FOR SELECT * FROM Jobs j WHERE j.oid = 53” .

(注意:由于我的mariadb服务器版本是10.2,我不能使用“SELECT ... NOWAIT”选项,必须使用“SET STATEMENT max_statement_time = 1 FOR ... . ” . ) .

我希望SELECT会失败,因为记录处于UPDATE的中间,应该是读/写锁定,但SELECT成功 . 只有当我向SELECT查询添加'for update'时,查询才会失败 . (但对我来说这不是一个好选择) .
我在这段时间检查了INNODB_LOCKS表,它是空的 .
在INNODB_TRX表中,我看到了具有隔离级别的事务 - REPEATABLE READ,但我不知道它是否与此相关 .
任何想法,如何使SELECT失败而不使它成为'for update'?

1 回答

  • 0

    通常,一致(和脏)读取是非锁定的,它们只是读取某种快照,具体取决于事务隔离级别 . 如果要使读取等待并发事务完成,则需要在执行读取的连接中将隔离级别设置为 SERIALIZABLE and 关闭自动提交 . 就像是

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    SET autocommit = 0;
    SET STATEMENT max_statement_time=1 FOR ...
    

    应该这样做 .

    Relevant page in MariaDB KB

    旁注:我个人的偏好是使用 innodb_lock_wait_timeout=1 而不是 max_statement_time=1 . 两者都会使语句失败,但 innodb_lock_wait_timeout 将导致更适合该情况的错误代码 .

相关问题