mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
row0mysql.c, row0mysql.h, ha_innodb.cc:
Inside LOCK TABLES, use either LOCK_S or LOCK_X in locking reads; an improvent over the previous patch sql/ha_innodb.cc: Inside LOCK TABLES, use either LOCK_S or LOCK_X in locking reads; an improvent over the previous patch innobase/include/row0mysql.h: Inside LOCK TABLES, use either LOCK_S or LOCK_X in locking reads; an improvent over the previous patch innobase/row/row0mysql.c: Inside LOCK TABLES, use either LOCK_S or LOCK_X in locking reads; an improvent over the previous patch
This commit is contained in:
@ -4505,16 +4505,38 @@ ha_innobase::start_stmt(
|
||||
|
||||
prebuilt->select_lock_type = LOCK_X;
|
||||
} else {
|
||||
/* For other than temporary tables, we obtain
|
||||
no lock for consistent read (plain SELECT), and
|
||||
an exclusive lock for SELECT ... FOR UPDATE or
|
||||
SELECT ... LOCK IN SHARE MODE. */
|
||||
/* When we first come here after LOCK TABLES,
|
||||
select_lock_type is set to LOCK_S or LOCK_X. Store the value
|
||||
in case we run also consistent reads and need to restore the
|
||||
value later. */
|
||||
|
||||
prebuilt->select_lock_type =
|
||||
thd->lex.sql_command == SQLCOM_SELECT
|
||||
&& thd->lex.lock_option == TL_READ
|
||||
? LOCK_NONE
|
||||
: LOCK_X;
|
||||
if (prebuilt->select_lock_type != LOCK_NONE) {
|
||||
prebuilt->stored_select_lock_type =
|
||||
prebuilt->select_lock_type;
|
||||
}
|
||||
|
||||
if (prebuilt->stored_select_lock_type != LOCK_S
|
||||
&& prebuilt->stored_select_lock_type != LOCK_X) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: select_lock_type is %lu inside ::start_stmt()!\n",
|
||||
prebuilt->stored_select_lock_type);
|
||||
|
||||
ut_error;
|
||||
}
|
||||
|
||||
if (thd->lex.sql_command == SQLCOM_SELECT
|
||||
&& thd->lex.lock_option == TL_READ) {
|
||||
|
||||
/* For other than temporary tables, we obtain
|
||||
no lock for consistent read (plain SELECT) */
|
||||
|
||||
prebuilt->select_lock_type = LOCK_NONE;
|
||||
} else {
|
||||
/* Not a consistent read: restore the
|
||||
select_lock_type value */
|
||||
prebuilt->select_lock_type =
|
||||
prebuilt->stored_select_lock_type;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the MySQL flag to mark that there is an active transaction */
|
||||
|
Reference in New Issue
Block a user