Skip to content

Commit e1aee41

Browse files
committed
Range Locking: READ COMMITTED doesnt take range locks but should still lock secondary keys
1 parent 332b090 commit e1aee41

File tree

4 files changed

+95
-3
lines changed

4 files changed

+95
-3
lines changed

mysql-test/suite/rocksdb/r/range_locking.result

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,3 +562,32 @@ rollback;
562562
drop table t1;
563563
disconnect con1;
564564
connection default;
565+
#
566+
# Range Locking and READ-COMMITTED, another test
567+
#
568+
create table t1 (
569+
pk int,
570+
a int,
571+
b int,
572+
primary key (pk),
573+
key(a)
574+
) engine=rocksdb;
575+
insert into t1 values
576+
(1, 100, 1000),
577+
(2, 200, 2000),
578+
(3, 300, 3000);
579+
set transaction isolation level repeatable read;
580+
begin;
581+
update t1 set b = b + 1 where a > 200;
582+
connect con1,localhost,root,,;
583+
connection con1;
584+
set transaction isolation level read committed;
585+
begin;
586+
insert into t1 values (4, 150, 1500);
587+
insert into t1 values (5, 250, 1500);
588+
ERROR HY000: Lock wait timeout exceeded; try restarting transaction: Timeout on index: test.t1.a
589+
rollback;
590+
disconnect con1;
591+
connection default;
592+
rollback;
593+
drop table t1;

mysql-test/suite/rocksdb/r/range_locking_rev_cf.result

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,3 +522,32 @@ rollback;
522522
drop table t1;
523523
disconnect con1;
524524
connection default;
525+
#
526+
# Range Locking and READ-COMMITTED, another test
527+
#
528+
create table t1 (
529+
pk int,
530+
a int,
531+
b int,
532+
primary key (pk),
533+
key(a)
534+
) engine=rocksdb;
535+
insert into t1 values
536+
(1, 100, 1000),
537+
(2, 200, 2000),
538+
(3, 300, 3000);
539+
set transaction isolation level repeatable read;
540+
begin;
541+
update t1 set b = b + 1 where a > 200;
542+
connect con1,localhost,root,,;
543+
connection con1;
544+
set transaction isolation level read committed;
545+
begin;
546+
insert into t1 values (4, 150, 1500);
547+
insert into t1 values (5, 250, 1500);
548+
ERROR HY000: Lock wait timeout exceeded; try restarting transaction: Timeout on index: test.t1.a
549+
rollback;
550+
disconnect con1;
551+
connection default;
552+
rollback;
553+
drop table t1;

mysql-test/suite/rocksdb/t/range_locking.inc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,3 +575,37 @@ drop table t1;
575575
disconnect con1;
576576
connection default;
577577

578+
--echo #
579+
--echo # Range Locking and READ-COMMITTED, another test
580+
--echo #
581+
create table t1 (
582+
pk int,
583+
a int,
584+
b int,
585+
primary key (pk),
586+
key(a)
587+
) engine=rocksdb;
588+
589+
insert into t1 values
590+
(1, 100, 1000),
591+
(2, 200, 2000),
592+
(3, 300, 3000);
593+
594+
set transaction isolation level repeatable read;
595+
begin;
596+
update t1 set b = b + 1 where a > 200;
597+
598+
connect (con1,localhost,root,,);
599+
connection con1;
600+
set transaction isolation level read committed;
601+
begin;
602+
insert into t1 values (4, 150, 1500);
603+
--error ER_LOCK_WAIT_TIMEOUT
604+
insert into t1 values (5, 250, 1500);
605+
606+
rollback;
607+
608+
disconnect con1;
609+
connection default;
610+
rollback;
611+
drop table t1;

storage/rocksdb/ha_rocksdb.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11429,7 +11429,7 @@ int ha_rocksdb::update_write_sk(const TABLE *const table_arg,
1142911429
reinterpret_cast<const char *>(m_sk_packed_tuple_old), old_packed_size);
1143011430

1143111431
/* Range locking: lock the index tuple being deleted */
11432-
if (m_use_range_locking) {
11432+
if (rocksdb_use_range_locking) {
1143311433
auto s= row_info.tx->lock_singlepoint_range(kd.get_cf(), old_key_slice);
1143411434
if (!s.ok()) {
1143511435
return (row_info.tx->set_status_error(table->in_use, s, kd,
@@ -11483,7 +11483,7 @@ int ha_rocksdb::update_write_sk(const TABLE *const table_arg,
1148311483
rc = bulk_load_key(row_info.tx, kd, new_key_slice, new_value_slice, true);
1148411484
} else {
1148511485
/* Range locking: lock the index tuple being inserted */
11486-
if (m_use_range_locking) {
11486+
if (rocksdb_use_range_locking) {
1148711487
auto s= row_info.tx->lock_singlepoint_range(kd.get_cf(), new_key_slice);
1148811488
if (!s.ok()) {
1148911489
return (row_info.tx->set_status_error(table->in_use, s, kd,
@@ -11926,7 +11926,7 @@ int ha_rocksdb::delete_row(const uchar *const buf) {
1192611926
For point locking, Deleting on secondary key doesn't need any locks.
1192711927
Range locking must get a lock.
1192811928
*/
11929-
if (m_use_range_locking) {
11929+
if (rocksdb_use_range_locking) {
1193011930
auto s= tx->lock_singlepoint_range(kd.get_cf(), secondary_key_slice);
1193111931
if (!s.ok()) {
1193211932
DBUG_RETURN(tx->set_status_error(table->in_use, s, kd, m_tbl_def,

0 commit comments

Comments
 (0)