Bug #24989 | 'Explicit or implicit commit' error/server crash with concurrent transactions | ||
---|---|---|---|
Submitted: | 12 Dec 2006 1:17 | Modified: | 3 Aug 2007 16:54 |
Reporter: | Rob Siklos | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Stored Routines | Severity: | S2 (Serious) |
Version: | 5.0.36-BK, 5.0.32, 5.0.27-community-max-nt | OS: | Linux (Linux, WinXP) |
Assigned to: | Evgeny Potemkin | CPU Architecture: | Any |
Tags: | bfsm_2007_02_15, bfsm_2007_05_31, bfsm_2007_06_21, bfsm_2007_06_28 |
[12 Dec 2006 1:17]
Rob Siklos
[12 Dec 2006 1:18]
Rob Siklos
Files for replication
Attachment: 24989.tar.gz (application/x-gzip, text), 1.41 KiB.
[12 Dec 2006 15:52]
Rob Siklos
Note: I changed my c# program to use the MySQL Connector/Net 1.0, and I get the same problem. This issue is causing us serious problems - any help would be greatly appreciated.
[14 Dec 2006 22:26]
Valeriy Kravchuk
Thank you for a problem report. Looks like your problem is caused by AUTOCOMMIT (see http://dev.mysql.com/doc/refman/5.0/en/innodb-and-autocommit.html) default (ON) setting in ODBC driver (http://msdn.microsoft.com/library/en-us/odbc/htm/odbcsqlsetconnectattr.asp?frame=true). Please, check.
[15 Dec 2006 21:45]
Rob Siklos
I can't see how this is the problem, since I start all transactions with the "START TRANSACTION" command. According to your first link, this allows me to perform a multiple-statement transaction even if autocommit is enabled. Am I missing something here? Thanks.
[27 Dec 2006 19:59]
Rob Siklos
Same thing happens in 5.1.14-beta-community-nt
[16 Jan 2007 12:43]
Valeriy Kravchuk
Sorry for a delay with this bug. I've got a crash with latest 5.0.36-BK (-debug build) on Linux when tried your test case: In T1: mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) Emysql> INSERT INTO data_staging (sensor_id, timestamp, value) -> VALUES (1, NOW() + INTERVAL FLOOR(RAND() * 10000) MINUTE, 1); Query OK, 1 row affected (0.03 sec) mysql> SELECT sleep(10); In T2: openxs@suse:~/dbs/5.0> bin/mysql -uroot bug24989 Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.0.36-debug Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> INSERT INTO data_staging (sensor_id, timestamp, value) -> VALUES (1, NOW() + INTERVAL FLOOR(RAND() * 10000) MINUTE, 1); In T1 (as soon as sleep(10) returned): +-----------+ | sleep(10) | +-----------+ | 0 | +-----------+ 1 row in set (10.01 sec) mysql> INSERT INTO data_staging (sensor_id, timestamp, value) -> VALUES (1, NOW() + INTERVAL FLOOR(RAND() * 10000) MINUTE, 1); Query OK, 1 row affected (0.02 sec) mysql> Number of processes running now: 0 070116 08:23:20 mysqld restarted In error log: Stack range sanity check OK, backtrace follows: 0x81d9c04 0xffffe410 0x401b6b75 0x401ae903 0x82acc93 0x82b8f00 0x82bc3eb 0x8250e24 0x824f982 0x81f3d82 0x834167d 0x83412ff 0x834151f 0x833e0f3 0x833e8c1 0x834fa5b 0x822292e 0x824f7f6 0x81f3d82 0x81f99d7 0x81f0335 0x81efb86 0x81eed72 0x40050aa7 0x40247c2e New value of fp=(nil) failed sanity check, terminating stack trace! Please read http://dev.mysql.com/doc/mysql/en/using-stack-trace.html and follow instructions on how to resolve the stack trace. Resolved stack trace is much more helpful in diagnosing the problem, so please do resolve it Trying to get some variables. Some pointers may be invalid and cause the dump to abort... thd->query at 0x8d3e598 = insert into _arrays (username, array_name) values ( li brary_user(), tocal_ids_n ) thd->thread_id=2 Resolved stack trace: openxs@suse:~/dbs/5.0> bin/resolve_stack_dump -s /tmp/mysqld50.sym -n 24989.st ack 0x81d9c04 handle_segfault + 412 0xffffe410 _end + -142011248 0x401b6b75 _end + 933534709 0x401ae903 _end + 933501315 0x82acc93 _Z17ha_rollback_transP3THDb + 209 0x82b8f00 _Z27convert_error_code_to_mysqliP3THD + 106 0x82bc3eb _ZN11ha_innobase9write_rowEPc + 1409 0x8250e24 _Z12write_recordP3THDP8st_tableP12st_copy_info + 1574 0x824f982 _Z12mysql_insertP3THDP13st_table_listR4ListI4ItemERS3_IS5_ES6_S6_15enu m_duplicatesb + 2320 0x81f3d82 _Z21mysql_execute_commandP3THD + 8974 0x834167d _ZN13sp_instr_stmt9exec_coreEP3THDPj + 17 0x83412ff _ZN13sp_lex_keeper23reset_lex_and_exec_coreEP3THDPjbP8sp_instr + 385 0x834151f _ZN13sp_instr_stmt7executeEP3THDPj + 287 0x833e0f3 _ZN7sp_head7executeEP3THD + 1157 0x833e8c1 _ZN7sp_head15execute_triggerEP3THDPKcS3_P13st_grant_info + 587 0x834fa5b _ZN19Table_triggers_list16process_triggersEP3THD14trg_event_type20trg_ action_time_typeb + 205 0x822292e _Z36fill_record_n_invoke_before_triggersP3THDR4ListI4ItemES4_bP19Table _triggers_list14trg_event_type + 76 0x824f7f6 _Z12mysql_insertP3THDP13st_table_listR4ListI4ItemERS3_IS5_ES6_S6_15enu m_duplicatesb + 1924 0x81f3d82 _Z21mysql_execute_commandP3THD + 8974 0x81f99d7 _Z11mysql_parseP3THDPcj + 475 0x81f0335 _Z16dispatch_command19enum_server_commandP3THDPcj + 1951 0x81efb86 _Z10do_commandP3THD + 526 0x81eed72 handle_one_connection + 982 0x40050aa7 _end + 932068135 0x40247c2e _end + 934128814 We have a serious crashing server bug here.
[16 Jan 2007 13:50]
Valeriy Kravchuk
With 5.0.36 (non-debug) I've got exactly the same result as bug reporter: mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO data_staging (sensor_id, timestamp, value) -> VALUES (1, NOW() + INTERVAL FLOOR(RAND() * 10000) MINUTE, 1); ERROR 1422 (HY000): Explicit or implicit commit is not allowed in stored functio n or trigger. This is still a bug, as there is no commit in triggers or functions.
[16 Jan 2007 13:58]
Valeriy Kravchuk
It is likely a duplicate of bug #19565. At least, it should be re-verified when bug #19565 will be fixed.
[21 Mar 2007 14:17]
Dmitry Lenev
Bug #27329 was marked as duplicate of this bug.
[28 May 2007 13:48]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/27471 ChangeSet@1.2500, 2007-05-28 17:45:02+04:00, evgen@moonbone.local +4 -0 Bug#24989: The DEADLOCK error is improperly handled by InnoDB. When innodb detects a deadlock it calls ha_rollback_trans() to rollback the main transaction. But such action isn't allowed from inside of triggers and functions. When it happen the 'Explicit or implicit commit' error is thrown even if there is no commit/rollback statements in the trigger/function. This leads to the user confusion. Now the convert_error_code_to_mysql() function doesn't call the ha_rollback_trans() function directly but rather returns an error. The sp_rcontext::find_handler() now doesn't allow DEADLOCK errors to be caught by the trigger/function error handlers.
[28 May 2007 20:10]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/27509 ChangeSet@1.2500, 2007-05-29 00:07:22+04:00, evgen@moonbone.local +5 -0 Bug#24989: The DEADLOCK error is improperly handled by InnoDB. When innodb detects a deadlock it calls ha_rollback_trans() to rollback the main transaction. But such action isn't allowed from inside of triggers and functions. When it happen the 'Explicit or implicit commit' error is thrown even if there is no commit/rollback statements in the trigger/function. This leads to the user confusion. Now the convert_error_code_to_mysql() function doesn't call the ha_rollback_trans() function directly but rather returns an error. The sp_rcontext::find_handler() now doesn't allow DEADLOCK errors to be caught by the trigger/function error handlers. Now the dispatch_command() function rolls back the main transaction if the DEADLOCK error occur during statement execution.
[30 May 2007 13:49]
Konstantin Osipov
A code review sent by email
[20 Jun 2007 17:37]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/29205 ChangeSet@1.2500, 2007-06-20 21:33:53+04:00, evgen@moonbone.local +8 -0 Bug#24989: The DEADLOCK error is improperly handled by InnoDB. When innodb detects a deadlock it calls ha_rollback_trans() to rollback the main transaction. But such action isn't allowed from inside of triggers and functions. When it happen the 'Explicit or implicit commit' error is thrown even if there is no commit/rollback statements in the trigger/function. This leads to the user confusion. Now the convert_error_code_to_mysql() function doesn't call the ha_rollback_trans() function directly but rather returns an error and sets the thd->transaction_rollback_request and the thd->is_fatal_sub_stmt_error flags. The sp_rcontext::find_handler() now doesn't allow errors to be caught by the trigger/function error handlers when the thd->is_fatal_sub_stmt_error flag is set. The transaction_rollback_request and the is_fatal_sub_stmt_error flags are added to the THD class. The are initialized by the THD class constructor. The function now resets The is_fatal_sub_stmt_error flag is reset by the reset_sub_statement_state function and the transaction_rollback_request - by the mysql_reset_thd_for_next_command and the ha_autocommit_or_rollback functions. Now the ha_autocommit_or_rollback function rolls back main transaction when not in a sub statement and the thd->transaction_rollback_request is set.
[4 Jul 2007 19:33]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/30327 ChangeSet@1.2500, 2007-07-04 23:23:58+04:00, evgen@moonbone.local +9 -0 Bug#24989: The DEADLOCK error is improperly handled by InnoDB. When innodb detects a deadlock it calls ha_rollback_trans() to rollback the main transaction. But such action isn't allowed from inside of triggers and functions. When it happen the 'Explicit or implicit commit' error is thrown even if there is no commit/rollback statements in the trigger/function. This leads to the user confusion. Now the convert_error_code_to_mysql() function doesn't call the ha_rollback_trans() function directly but rather calls the mark_transaction_to_rollback function and returns an error. The sp_rcontext::find_handler() now doesn't allow errors to be caught by the trigger/function error handlers when the thd->is_fatal_sub_stmt_error flag is set. Procedures are still allowed to catch such errors. The transaction_rollback_request and the is_fatal_sub_stmt_error flags are added to the THD class. The are initialized by the THD class constructor. Now the mysql_execute_command function resets the THD::is_fatal_sub_stmt_error flag. Now the ha_autocommit_or_rollback function rolls back main transaction when not in a sub statement and the thd->transaction_rollback_request is set. The sp_head::execute function now allows execution of a continue handler after fatal error but aborts right after it.
[9 Jul 2007 20:51]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/30568 ChangeSet@1.2500, 2007-07-10 00:48:08+04:00, evgen@moonbone.local +9 -0 Bug#24989: The DEADLOCK error is improperly handled by InnoDB. When innodb detects a deadlock it calls ha_rollback_trans() to rollback the main transaction. But such action isn't allowed from inside of triggers and functions. When it happen the 'Explicit or implicit commit' error is thrown even if there is no commit/rollback statements in the trigger/function. This leads to the user confusion. Now the convert_error_code_to_mysql() function doesn't call the ha_rollback_trans() function directly but rather calls the mark_transaction_to_rollback function and returns an error. The sp_rcontext::find_handler() now doesn't allow errors to be caught by the trigger/function error handlers when the thd->is_fatal_sub_stmt_error flag is set. Procedures are still allowed to catch such errors. The sp_rcontext::find_handler function now accepts a THD handle as a parameter. The transaction_rollback_request and the is_fatal_sub_stmt_error flags are added to the THD class. The are initialized by the THD class constructor. Now the mysql_execute_command function resets the THD::is_fatal_sub_stmt_error flag. Now the ha_autocommit_or_rollback function rolls back main transaction when not in a sub statement and the thd->transaction_rollback_request is set.
[12 Jul 2007 22:07]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/30847 ChangeSet@1.2500, 2007-07-13 02:04:05+04:00, evgen@moonbone.local +8 -0 Bug#24989: The DEADLOCK error is improperly handled by InnoDB. When innodb detects a deadlock it calls ha_rollback_trans() to rollback the main transaction. But such action isn't allowed from inside of triggers and functions. When it happen the 'Explicit or implicit commit' error is thrown even if there is no commit/rollback statements in the trigger/function. This leads to the user confusion. Now the convert_error_code_to_mysql() function doesn't call the ha_rollback_trans() function directly but rather calls the mark_transaction_to_rollback function and returns an error. The sp_rcontext::find_handler() now doesn't allow errors to be caught by the trigger/function error handlers when the thd->is_fatal_sub_stmt_error flag is set. Procedures are still allowed to catch such errors. The sp_rcontext::find_handler function now accepts a THD handle as a parameter. The transaction_rollback_request and the is_fatal_sub_stmt_error flags are added to the THD class. The are initialized by the THD class constructor. Now the ha_autocommit_or_rollback function rolls back main transaction when not in a sub statement and the thd->transaction_rollback_request is set. The THD::restore_sub_statement_state function now resets the thd->is_fatal_sub_stmt_error flag on exit from a sub-statement.
[18 Jul 2007 13:32]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/31088 ChangeSet@1.2500, 2007-07-18 17:28:14+04:00, evgen@moonbone.local +9 -0 Bug#24989: The DEADLOCK error is improperly handled by InnoDB. When innodb detects a deadlock it calls ha_rollback_trans() to rollback the main transaction. But such action isn't allowed from inside of triggers and functions. When it happen the 'Explicit or implicit commit' error is thrown even if there is no commit/rollback statements in the trigger/function. This leads to the user confusion. Now the convert_error_code_to_mysql() function doesn't call the ha_rollback_trans() function directly but rather calls the mark_transaction_to_rollback function and returns an error. The sp_rcontext::find_handler() now doesn't allow errors to be caught by the trigger/function error handlers when the thd->is_fatal_sub_stmt_error flag is set. Instead it tries to find a most inner procedure that isn't called directly or indirectly from any function/trigger. Procedures are still allowed to catch such errors. The sp_rcontext::find_handler function now accepts a THD handle as a parameter. The transaction_rollback_request and the is_fatal_sub_stmt_error flags are added to the THD class. The are initialized by the THD class constructor. Now the ha_autocommit_or_rollback function rolls back main transaction when not in a sub statement and the thd->transaction_rollback_request is set. The THD::restore_sub_statement_state function now resets the thd->is_fatal_sub_stmt_error flag on exit from a sub-statement.
[19 Jul 2007 16:08]
Robin Keech
Hi, We've just run up against this problem using 5.0.38 and a very simplified schema and trigger. (can provide example if required) We have just noticed that the issue is resolved when the auto-increment part of the table definition is removed. I was wondering if this is as you expect after making the patch or if there may be another issue here. Is there an expected date when this patch will make it into the next release of 5.0? Thanks,
[30 Jul 2007 13:23]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/31819 ChangeSet@1.2500, 2007-07-30 17:14:34+04:00, evgen@moonbone.local +8 -0 Bug#24989: The DEADLOCK error is improperly handled by InnoDB. When innodb detects a deadlock it calls ha_rollback_trans() to rollback the main transaction. But such action isn't allowed from inside of triggers and functions. When it happen the 'Explicit or implicit commit' error is thrown even if there is no commit/rollback statements in the trigger/function. This leads to the user confusion. Now the convert_error_code_to_mysql() function doesn't call the ha_rollback_trans() function directly but rather calls the mark_transaction_to_rollback function and returns an error. The sp_rcontext::find_handler() now doesn't allow errors to be caught by the trigger/function error handlers when the thd->is_fatal_sub_stmt_error flag is set. Procedures are still allowed to catch such errors. The sp_rcontext::find_handler function now accepts a THD handle as a parameter. The transaction_rollback_request and the is_fatal_sub_stmt_error flags are added to the THD class. The are initialized by the THD class constructor. Now the ha_autocommit_or_rollback function rolls back main transaction when not in a sub statement and the thd->transaction_rollback_request is set. The THD::restore_sub_statement_state function now resets the thd->is_fatal_sub_stmt_error flag on exit from a sub-statement.
[31 Jul 2007 20:06]
Konstantin Osipov
Bug #19565 crash in system test, trigger, InnoDB transaction deadlock was marked a duplicate of this bug.
[2 Aug 2007 19:12]
Bugs System
Pushed into 5.1.21-beta
[2 Aug 2007 19:15]
Bugs System
Pushed into 5.0.48
[3 Aug 2007 16:54]
Paul DuBois
Noted in 5.0.48, 5.1.21 changelogs. In a stored function or trigger, when InnoDB detected deadlock, it attempted rollback and displayed an incorrect error message (Explicit or implicit commit is not allowed in stored function or trigger). Now InnoDB returns an error under these conditions and does not attempt rollback.