ha_innobase.cc:
Backport of bug fix in 4.0: do not x-lock rows under LOCK TABLES READ unless the table is a temp table
This commit is contained in:
parent
5fedf659d8
commit
541c40b000
@ -3453,7 +3453,7 @@ ha_innobase::start_stmt(
|
|||||||
prebuilt->hint_no_need_to_fetch_extra_cols = TRUE;
|
prebuilt->hint_no_need_to_fetch_extra_cols = TRUE;
|
||||||
prebuilt->read_just_key = 0;
|
prebuilt->read_just_key = 0;
|
||||||
|
|
||||||
if (prebuilt->select_lock_type == LOCK_NONE) {
|
if (!prebuilt->mysql_has_locked) {
|
||||||
/* This handle is for a temporary table created inside
|
/* This handle is for a temporary table created inside
|
||||||
this same LOCK TABLES; since MySQL does NOT call external_lock
|
this same LOCK TABLES; since MySQL does NOT call external_lock
|
||||||
in this case, we must use x-row locks inside InnoDB to be
|
in this case, we must use x-row locks inside InnoDB to be
|
||||||
@ -3510,6 +3510,7 @@ ha_innobase::external_lock(
|
|||||||
|
|
||||||
thd->transaction.all.innodb_active_trans = 1;
|
thd->transaction.all.innodb_active_trans = 1;
|
||||||
trx->n_mysql_tables_in_use++;
|
trx->n_mysql_tables_in_use++;
|
||||||
|
prebuilt->mysql_has_locked = TRUE;
|
||||||
|
|
||||||
if (thd->tx_isolation == ISO_SERIALIZABLE
|
if (thd->tx_isolation == ISO_SERIALIZABLE
|
||||||
&& prebuilt->select_lock_type == LOCK_NONE) {
|
&& prebuilt->select_lock_type == LOCK_NONE) {
|
||||||
@ -3527,6 +3528,7 @@ ha_innobase::external_lock(
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
trx->n_mysql_tables_in_use--;
|
trx->n_mysql_tables_in_use--;
|
||||||
|
prebuilt->mysql_has_locked = FALSE;
|
||||||
auto_inc_counter_for_this_stat = 0;
|
auto_inc_counter_for_this_stat = 0;
|
||||||
|
|
||||||
if (trx->n_mysql_tables_in_use == 0) {
|
if (trx->n_mysql_tables_in_use == 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user