Browse Source

MDEV-37215 SELECT FOR UPDATE crash in SERIALIZABLE

ha_innobase::store_lock(): Set also trx->will_lock when starting
a transaction at SERIALIZABLE isolation level. This fixes up
commit 7fbbbc983f (MDEV-36330).
pull/4194/head
Marko Mäkelä 3 months ago
parent
commit
b7b2e009b3
  1. 9
      mysql-test/suite/innodb/r/lock_isolation.result
  2. 10
      mysql-test/suite/innodb/t/lock_isolation.test
  3. 1
      storage/innobase/handler/ha_innodb.cc

9
mysql-test/suite/innodb/r/lock_isolation.result

@ -283,4 +283,13 @@ COMMIT;
disconnect consistent;
connection default;
DROP TABLE t1,t2;
#
# MDEV-37215 SELECT...FOR UPDATE crash under SERIALIZABLE
#
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
SELECT * FROM t1 FOR UPDATE;
a
DROP TABLE t1;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
# End of 10.6 tests

10
mysql-test/suite/innodb/t/lock_isolation.test

@ -295,5 +295,15 @@ COMMIT;
--connection default
DROP TABLE t1,t2;
--echo #
--echo # MDEV-37215 SELECT...FOR UPDATE crash under SERIALIZABLE
--echo #
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
SELECT * FROM t1 FOR UPDATE;
DROP TABLE t1;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
--source include/wait_until_count_sessions.inc
--echo # End of 10.6 tests

1
storage/innobase/handler/ha_innodb.cc

@ -16510,6 +16510,7 @@ ha_innobase::store_lock(
case ISO_SERIALIZABLE:
auto trx_state = trx->state;
if (trx_state == TRX_STATE_NOT_STARTED) {
trx->will_lock = true;
trx_start_if_not_started(trx, false);
trx->read_view.open(trx);
} else {

Loading…
Cancel
Save