#At file:///home/marko/innobase/dev/mysql/5.1-innodb/ based on revid:marko.makela@strippeddrl9fdlapx
3417 Marko Mäkelä 2010-04-26
row_search_for_mysql(): Never try semi-consistent read in unique searches.
They are only useful in table scans. (Bug #52663)
added:
mysql-test/suite/innodb/r/innodb_bug52663.result
mysql-test/suite/innodb/t/innodb_bug52663-master.opt
mysql-test/suite/innodb/t/innodb_bug52663.test
mysql-test/suite/innodb_plugin/r/innodb_bug52663.result
mysql-test/suite/innodb_plugin/t/innodb_bug52663.test
modified:
storage/innobase/row/row0sel.c
storage/innodb_plugin/ChangeLog
storage/innodb_plugin/row/row0sel.c
=== added file 'mysql-test/suite/innodb/r/innodb_bug52663.result'
--- a/mysql-test/suite/innodb/r/innodb_bug52663.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb/r/innodb_bug52663.result 2010-04-26 10:27:25 +0000
@@ -0,0 +1,26 @@
+set session transaction isolation level read committed;
+create table innodb_bug52663 (what varchar(5), id integer, count integer, primary key
+(what, id)) engine=innodb;
+insert into innodb_bug52663 values ('total', 0, 0);
+begin;
+set session transaction isolation level read committed;
+begin;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+what id count
+total 0 1
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+select * from innodb_bug52663;
+what id count
+total 0 0
+commit;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+commit;
+select * from innodb_bug52663;
+what id count
+total 0 2
+select * from innodb_bug52663;
+what id count
+total 0 2
+drop table innodb_bug52663;
=== added file 'mysql-test/suite/innodb/t/innodb_bug52663-master.opt'
--- a/mysql-test/suite/innodb/t/innodb_bug52663-master.opt 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb/t/innodb_bug52663-master.opt 2010-04-26 10:27:25 +0000
@@ -0,0 +1 @@
+--innodb_lock_wait_timeout=1
=== added file 'mysql-test/suite/innodb/t/innodb_bug52663.test'
--- a/mysql-test/suite/innodb/t/innodb_bug52663.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb/t/innodb_bug52663.test 2010-04-26 10:27:25 +0000
@@ -0,0 +1,34 @@
+--source include/have_innodb.inc
+
+set session transaction isolation level read committed;
+
+create table innodb_bug52663 (what varchar(5), id integer, count integer, primary key
+(what, id)) engine=innodb;
+insert into innodb_bug52663 values ('total', 0, 0);
+begin;
+
+connect (addconroot, localhost, root,,);
+connection addconroot;
+set session transaction isolation level read committed;
+begin;
+
+connection default;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+
+connection addconroot;
+--error ER_LOCK_WAIT_TIMEOUT
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+
+connection default;
+commit;
+
+connection addconroot;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+commit;
+select * from innodb_bug52663;
+
+connection default;
+select * from innodb_bug52663;
+drop table innodb_bug52663;
=== added file 'mysql-test/suite/innodb_plugin/r/innodb_bug52663.result'
--- a/mysql-test/suite/innodb_plugin/r/innodb_bug52663.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb_plugin/r/innodb_bug52663.result 2010-04-26 10:27:25 +0000
@@ -0,0 +1,26 @@
+set session transaction isolation level read committed;
+create table innodb_bug52663 (what varchar(5), id integer, count integer, primary key
+(what, id)) engine=innodb;
+insert into innodb_bug52663 values ('total', 0, 0);
+begin;
+set session transaction isolation level read committed;
+begin;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+what id count
+total 0 1
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+select * from innodb_bug52663;
+what id count
+total 0 0
+commit;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+commit;
+select * from innodb_bug52663;
+what id count
+total 0 2
+select * from innodb_bug52663;
+what id count
+total 0 2
+drop table innodb_bug52663;
=== added file 'mysql-test/suite/innodb_plugin/t/innodb_bug52663.test'
--- a/mysql-test/suite/innodb_plugin/t/innodb_bug52663.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb_plugin/t/innodb_bug52663.test 2010-04-26 10:27:25 +0000
@@ -0,0 +1,34 @@
+--source include/have_innodb_plugin.inc
+
+set session transaction isolation level read committed;
+
+create table innodb_bug52663 (what varchar(5), id integer, count integer, primary key
+(what, id)) engine=innodb;
+insert into innodb_bug52663 values ('total', 0, 0);
+begin;
+
+connect (addconroot, localhost, root,,);
+connection addconroot;
+set session transaction isolation level read committed;
+begin;
+
+connection default;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+
+connection addconroot;
+--error ER_LOCK_WAIT_TIMEOUT
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+select * from innodb_bug52663;
+
+connection default;
+commit;
+
+connection addconroot;
+update innodb_bug52663 set count = count + 1 where what = 'total' and id = 0;
+commit;
+select * from innodb_bug52663;
+
+connection default;
+select * from innodb_bug52663;
+drop table innodb_bug52663;
=== modified file 'storage/innobase/row/row0sel.c'
--- a/storage/innobase/row/row0sel.c 2010-03-15 08:17:31 +0000
+++ b/storage/innobase/row/row0sel.c 2010-04-26 10:27:25 +0000
@@ -3956,6 +3956,7 @@ no_gap_lock:
case DB_LOCK_WAIT:
if (UNIV_LIKELY(prebuilt->row_read_type
!= ROW_READ_TRY_SEMI_CONSISTENT)
+ || unique_search
|| index != clust_index) {
goto lock_wait_or_error;
=== modified file 'storage/innodb_plugin/ChangeLog'
--- a/storage/innodb_plugin/ChangeLog 2010-04-22 09:33:42 +0000
+++ b/storage/innodb_plugin/ChangeLog 2010-04-26 10:27:25 +0000
@@ -1,3 +1,9 @@
+2010-04-26 The InnoDB Team
+
+ * row/row0sel.c:
+ Fix Bug#52663 Lost update incrementing column value under
+ READ COMMITTED isolation level
+
2010-04-22 The InnoDB Team
* include/dict0boot.h, dict/dict0boot.c:
=== modified file 'storage/innodb_plugin/row/row0sel.c'
--- a/storage/innodb_plugin/row/row0sel.c 2010-03-31 07:49:08 +0000
+++ b/storage/innodb_plugin/row/row0sel.c 2010-04-26 10:27:25 +0000
@@ -4027,6 +4027,7 @@ no_gap_lock:
case DB_LOCK_WAIT:
if (UNIV_LIKELY(prebuilt->row_read_type
!= ROW_READ_TRY_SEMI_CONSISTENT)
+ || unique_search
|| index != clust_index) {
goto lock_wait_or_error;
Attachment: [text/bzr-bundle] bzr/marko.makela@oracle.com-20100426102725-as2vc44ddykg1786.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-innodb branch (marko.makela:3417) Bug#52663 | marko.makela | 26 Apr |