mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-7660 - MySQL WL#6671 "Improve scalability by not using thr_lock.c locks
for InnoDB tables" Don't use thr_lock.c locks for InnoDB tables. Below is list of changes that were needed to implement this: - HANDLER OPEN acquireis MDL_SHARED_READ instead of MDL_SHARED - HANDLER READ calls external_lock() even if SE is not going to be locked by THR_LOCK - InnoDB lock wait timeouts are now honored which are much shorter by default than server lock wait timeouts (1 year vs 50 seconds) - with @@autocommit= 1 LOCK TABLES disables autocommit implicitely, though user still sees @@autocommt= 1 - the above starts implicit transaction - transactions started by LOCK TABLES are now rolled back on disconnect (previously everything was committed due to autocommit) - transactions started by LOCK TABLES are now rolled back by ROLLBACK (previously everything was committed due to autocommit) - it is now impossible to change BINLOG_FORMAT under LOCK TABLES (at least to statement) due to running transaction - LOCK TABLES WRITE is additionally handled by MDL - ...in contrast LOCK TABLES READ protection against DML is pure InnoDB - combining transactional and non-transactional tables under LOCK TABLES may cause rolled back changes in transactional table and "committed" changes in non-transactional table - user may disable innodb_table_locks, which will cause LOCK TABLES to be noop basically Removed tests for BUG#45143 and BUG#55930 which cover InnoDB + THR_LOCK. To operate properly these tests require code flow to go through THR_LOCK debug sync points, which is not the case after this patch. These tests are removed by WL#6671 as well. An alternative is to port them to different storage engine.
This commit is contained in:
@ -282,7 +282,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, SQL_HANDLER *reopen)
|
||||
back-off for such locks.
|
||||
*/
|
||||
tables->mdl_request.init(MDL_key::TABLE, tables->db, tables->table_name,
|
||||
MDL_SHARED, MDL_TRANSACTION);
|
||||
MDL_SHARED_READ, MDL_TRANSACTION);
|
||||
mdl_savepoint= thd->mdl_context.mdl_savepoint();
|
||||
|
||||
/* for now HANDLER can be used only for real TABLES */
|
||||
@ -750,11 +750,12 @@ retry:
|
||||
tables->table= table; // This is used by fix_fields
|
||||
table->pos_in_table_list= tables;
|
||||
|
||||
if (handler->lock->lock_count > 0)
|
||||
if (handler->lock->table_count > 0)
|
||||
{
|
||||
int lock_error;
|
||||
|
||||
handler->lock->locks[0]->type= handler->lock->locks[0]->org_type;
|
||||
if (handler->lock->lock_count > 0)
|
||||
handler->lock->locks[0]->type= handler->lock->locks[0]->org_type;
|
||||
|
||||
/* save open_tables state */
|
||||
TABLE* backup_open_tables= thd->open_tables;
|
||||
|
Reference in New Issue
Block a user