Bug #16229 MySQL/InnoDB uses full explicit table locks in trigger processing

Submitted: 5 Jan 2006 15:57 Modified: 20 Jun 2010 1:08
Reporter: Heikki Tuuri Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: InnoDB storage engine Severity:S3 (Non-critical)
Version:5.0 OS:Any (All)
Assigned to: CPU Architecture:Any

[5 Jan 2006 15:57] Heikki Tuuri
Description:
Hi!

This was noted in the Forums:

http://forums.mysql.com/read.php?22,59979

A trigger requests an X-lock on the table, and ha_innobase::store_lock() does not weaken it, probably because MySQL has set:

thd->in_lock_tables == TRUE

and

thd->lex->sql_command != SQLCOM_CALL.

That can cause a lot of deadlocks and reduced concurrency.

Regards,

Heikki

How to repeat:
See above.

Suggested fix:
We should check what SQLCOM_... code corresponds to an explicit LOCK TABLES command by the user, and in all the other cases weaken lock_type not to take a full table lock.
[6 Jan 2006 15:22] Valeriy Kravchuk
Thank you for a problem report. Can you, please, provide a simple test case, because I had not found a trigger definition on that forum thread.
[7 Jan 2006 1:13] Heikki Tuuri
Valeriy,

I guess any trigger that modifies the table we are inserting into will serve as an example. InnoDB currently only weakens the locks in the SQLCOM_CALL case. But in trigger execution I guess it is SQLCOM_INSERT or similar.

Regards,

Heikki
[9 Jan 2006 10:52] Heikki Tuuri
Assigning this to Jan. Please check what SQLCOM_... code corresponds to an explicit LOCK TABLES command by the user. In other cases, weaken the lock like we do in the SQLCOM_CALL case (a stored procedure call).
[9 Jan 2006 11:12] Jan Lindström
Tested using 5.0.18 and query LOCK TABLES t1 READ. In this case thd->lex->sql_command == 
SQLCOM_LOCK_TABLES.
[9 Jan 2006 13:32] Jan Lindström
Verified using gdb (set a breakpoint to ha_innobase::external_lock) and using MySQL 5.0.18 with following test case:

CREATE TABLE t1 (id int NOT NULL, b int, PRIMARY KEY  (id)) ENGINE=InnoDB;
delimiter |
create trigger t1t after insert on t1 for each row begin update t1 set NEW.b = 5; end |
delimiter ;
insert into t1(id) values (111),(121),(131);

Here is gdb output:

Breakpoint 1, ha_innobase::external_lock (this=0x8cab360, thd=0x8c77788, lock_type=1) at ha_innodb.cc:6338

6338                    if (prebuilt->select_lock_type != LOCK_NONE) {
(gdb)
6340                            if (thd->in_lock_tables &&
(gdb)
6347                                                            NULL, 0);
(gdb) list 6346
6341                                thd->lex->sql_command != SQLCOM_CALL &&
6342                                thd->variables.innodb_table_locks &&
6343                                (thd->options & OPTION_NOT_AUTOCOMMIT)) {
6344
6345                                    ulint   error;
6346                                    error = row_lock_table_for_mysql(prebuilt,
6347                                                            NULL, 0);
6348
6349                                    if (error != DB_SUCCESS) {
6350                                            error = convert_error_code_to_mysql(
(gdb) p thd->in_lock_tables
$3 = true
(gdb) p thd->lex->sql_command
$4 = SQLCOM_INSERT
[31 Jan 2006 18:53] Alexander Ivanov
Fixed in 5.0.19.
Patch: http://lists.mysql.com/commits/1958.
[2 Feb 2006 17:53] Mike Hillyer
Documented in 5.0.19 changelog:

     <listitem>
        <para>
          InnoDB used full explicit table locks
          in trigger processing. (Bug #16229)
        </para>
      </listitem>
[24 May 2006 12:23] Dmitry Lenev
Bug #13893 was marked as duplicate of this bug.
[5 May 2010 15:27] Bugs System
Pushed into 5.1.47 (revid:joro@sun.com-20100505145753-ivlt4hclbrjy8eye) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[6 May 2010 1:48] Paul DuBois
Push resulted from incorporation of InnoDB tree. No changes pertinent to this bug. Re-closing.
[28 May 2010 6:13] Bugs System
Pushed into mysql-next-mr (revid:alik@sun.com-20100524190136-egaq7e8zgkwb9aqi) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (pib:16)
[28 May 2010 6:41] Bugs System
Pushed into 6.0.14-alpha (revid:alik@sun.com-20100524190941-nuudpx60if25wsvx) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[28 May 2010 7:08] Bugs System
Pushed into 5.5.5-m3 (revid:alik@sun.com-20100524185725-c8k5q7v60i5nix3t) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[29 May 2010 23:13] Paul DuBois
Push resulted from incorporation of InnoDB tree. No changes pertinent to this bug.
Re-closing.
[17 Jun 2010 12:18] Bugs System
Pushed into 5.1.47-ndb-7.0.16 (revid:martin.skold@mysql.com-20100617114014-bva0dy24yyd67697) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[17 Jun 2010 13:05] Bugs System
Pushed into 5.1.47-ndb-6.2.19 (revid:martin.skold@mysql.com-20100617115448-idrbic6gbki37h1c) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[17 Jun 2010 13:45] Bugs System
Pushed into 5.1.47-ndb-6.3.35 (revid:martin.skold@mysql.com-20100617114611-61aqbb52j752y116) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.045 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.