1. 首页
  2. IT资讯

MySQL:关于Bug #81119

修复版本5.7.18,下面是commit,记录一下后面详细学习。

故障

下面是commit

  $ git show a43f7d5a6130550619afad3fb513c98e00dc505e  commit a43f7d5a6130550619afad3fb513c98e00dc505e  Author: Daogang Qu <bill.qu@oracle.com>  Date:   Wed Jan 20 09:25:36 2016 +0800      Bug#22130929  GTID_NEXT AND BEGIN BEHAVIOR IS DIFFERENT B/W BINLOG AND BINLOG-LESS SERVER      Problem      =======      When binlog is enabled, we do not save the gtid specified by      GTID_NEXT into GLOBAL@gtid_executed when committing an empty      transaction caused by a 'BEGIN' command. But we save the gtid      into GLOBAL@gtid_executed in the case when binlog is disabled.      Fix      ===      When @@SESSION.GTID_NEXT == 'UUID:NUMBER', the command 'BEGIN' causes      an error 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET'      inside an empty/a non-empty transaction regardless of being binlogless      or not, since it causes an implicit commit like other DDLs. And we do      not save the gtid specified by GTID_NEXT into GLOBAL@gtid_executed      in the case.  diff --git a/mysql-test/extra/binlog_tests/gtid_next_begin_caused_trx.test b/mysql-test/extra/binlog_tests/gtid_next_begin_caused_trx.test  new file mode 100644  index 00000000000..1459bcdf775  --- /dev/null  +++ b/mysql-test/extra/binlog_tests/gtid_next_begin_caused_trx.test  @@ -0,0 +1,76 @@  +# ==== Purpose ====  +#  +# When @@SESSION.GTID_NEXT == 'UUID:NUMBER', verify that the command  +# 'BEGIN' causes an error  +# 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +# an empty/a non-empty transaction, since it causes an implicit  +# commit. We do not save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed in the case.  +#  +# ==== Implementation ====  +#  +# 1) Set @@SESSION.GTID_NEXT == 'UUID:NUMBER'  +# 2) Execute a 'BEGIN' command to start a transaction.  +# 3) Execute another 'BEGIN' command to check if it causes an error  +#    'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET'  +#    inside an empty transaction, and we do not save the gtid  +#    specified by GTID_NEXT into GLOBAL@gtid_executed.  +# 4) Execute an 'INSERT' statement.  +# 5) Execute the third 'BEGIN' command to check if it causes an error  +#    'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET'  +#    inside a non-empty transaction, and we do not save the gtid  +#    specified by GTID_NEXT into GLOBAL@gtid_executed.  +# 6) Check that we save the gtid specified by GTID_NEXT into  +#    GLOBAL@gtid_executed when committing the transaction.  +#  +# ==== References ====  +#  +# Bug#22130929  GTID_NEXT AND BEGIN BEHAVIOR IS DIFFERENT B/W BINLOG AND BINLOG-LESS SERVER  +# Caller: suite/binlog/t/binlog_gtid_next_begin_caused_trx.test  +# Caller: t/no_binlog_gtid_next_begin_caused_trx.test  +#  +  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1';  +CREATE TABLE t1 (c1 INT);  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2';  +BEGIN;  +  +--echo #  +--echo # Check that the command 'BEGIN' causes an error  +--echo # 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +--echo # an empty transaction, since it causes an implicit commit. And we  +--echo # do not save the gtid specified by GTID_NEXT into  +--echo # GLOBAL@gtid_executed in the case.  +--echo #  +--error ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET  +BEGIN;  +--let $assert_text= Dose not commit gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2  +--let $assert_cond= "[SELECT @@GLOBAL.GTID_EXECUTED]" = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1"  +--source include/assert.inc  +  +INSERT INTO t1 VALUES (1);  +--echo #  +--echo # Check that the command 'BEGIN' causes an error  +--echo # 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +--echo # a non-empty transaction, since it causes an implicit commit. And  +--echo # we do not save the gtid specified by GTID_NEXT into  +--echo # GLOBAL@gtid_executed in the case.  +--echo #  +--error ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET  +BEGIN;  +--let $assert_text= Dose not commit gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2  +--let $assert_cond= "[SELECT @@GLOBAL.GTID_EXECUTED]" = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1"  +--source include/assert.inc  +  +--echo #  +--echo # Check that we save the gtid specified by GTID_NEXT into  +--echo # GLOBAL@gtid_executed when committing the transaction.  +--echo #  +COMMIT;  +--let $assert_text= Committed gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2  +--let $assert_cond= "[SELECT @@GLOBAL.GTID_EXECUTED]" = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-2"  +--source include/assert.inc  +  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3';  +DROP TABLE t1;  +  diff --git a/mysql-test/r/no_binlog_gtid_next_begin_caused_trx.result b/mysql-test/r/no_binlog_gtid_next_begin_caused_trx.result  new file mode 100644  index 00000000000..44f6216c1b6  --- /dev/null  +++ b/mysql-test/r/no_binlog_gtid_next_begin_caused_trx.result  @@ -0,0 +1,34 @@  +RESET MASTER;  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1';  +CREATE TABLE t1 (c1 INT);  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2';  +BEGIN;  +#  +# Check that the command 'BEGIN' causes an error  +# 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +# an empty transaction, since it causes an implicit commit. And we  +# do not save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed in the case.  +#  +BEGIN;  +ERROR HY000: Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTID_NEXT == 'UUID:NUMBER'.  +include/assert.inc [Dose not commit gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2]  +INSERT INTO t1 VALUES (1);  +#  +# Check that the command 'BEGIN' causes an error  +# 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +# a non-empty transaction, since it causes an implicit commit. And  +# we do not save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed in the case.  +#  +BEGIN;  +ERROR HY000: Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTID_NEXT == 'UUID:NUMBER'.  +include/assert.inc [Dose not commit gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2]  +#  +# Check that we save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed when committing the transaction.  +#  +COMMIT;  +include/assert.inc [Committed gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2]  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3';  +DROP TABLE t1;  diff --git a/mysql-test/suite/binlog/r/binlog_gtid_next_begin_caused_trx.result b/mysql-test/suite/binlog/r/binlog_gtid_next_begin_caused_trx.result  new file mode 100644  index 00000000000..44f6216c1b6  --- /dev/null  +++ b/mysql-test/suite/binlog/r/binlog_gtid_next_begin_caused_trx.result  @@ -0,0 +1,34 @@  +RESET MASTER;  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1';  +CREATE TABLE t1 (c1 INT);  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2';  +BEGIN;  +#  +# Check that the command 'BEGIN' causes an error  +# 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +# an empty transaction, since it causes an implicit commit. And we  +# do not save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed in the case.  +#  +BEGIN;  +ERROR HY000: Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTID_NEXT == 'UUID:NUMBER'.  +include/assert.inc [Dose not commit gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2]  +INSERT INTO t1 VALUES (1);  +#  +# Check that the command 'BEGIN' causes an error  +# 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +# a non-empty transaction, since it causes an implicit commit. And  +# we do not save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed in the case.  +#  +BEGIN;  +ERROR HY000: Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTID_NEXT == 'UUID:NUMBER'.  +include/assert.inc [Dose not commit gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2]  +#  +# Check that we save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed when committing the transaction.  +#  +COMMIT;  +include/assert.inc [Committed gtid aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2]  +SET GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3';  +DROP TABLE t1;  diff --git a/mysql-test/suite/binlog/t/binlog_gtid_next_begin_caused_trx.test b/mysql-test/suite/binlog/t/binlog_gtid_next_begin_caused_trx.test  new file mode 100644  index 00000000000..dc12cb95fa8  --- /dev/null  +++ b/mysql-test/suite/binlog/t/binlog_gtid_next_begin_caused_trx.test  @@ -0,0 +1,30 @@  +# ==== Purpose ====  +#  +# When binlog is enabled and @@SESSION.GTID_NEXT == 'UUID:NUMBER',  +# verify that the command 'BEGIN' causes an error  +# 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +# an empty/a non-empty transaction, since it causes an implicit  +# commit. We do not save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed in the case.  +#  +# ==== Implementation ====  +#  +# See extra/binlog_tests/gtid_next_begin_caused_trx.test  +#  +# ==== References ====  +#  +# Bug#22130929  GTID_NEXT AND BEGIN BEHAVIOR IS DIFFERENT B/W BINLOG AND BINLOG-LESS SERVER  +#  +  +# Test in this file is binlog format agnostic, thus no need  +# to rerun them for every format.  +--source include/have_binlog_format_row.inc  +--source include/have_gtid.inc  +# Test is not required to run against embedded server  +--source include/not_embedded.inc  +  +# Make sure the test is repeatable  +RESET MASTER;  +  +--source extra/binlog_tests/gtid_next_begin_caused_trx.test  +  diff --git a/mysql-test/t/no_binlog_gtid_next_begin_caused_trx-master.opt b/mysql-test/t/no_binlog_gtid_next_begin_caused_trx-master.opt  new file mode 100644  index 00000000000..f3fd62da9b7  --- /dev/null  +++ b/mysql-test/t/no_binlog_gtid_next_begin_caused_trx-master.opt  @@ -0,0 +1,2 @@  +--gtid_mode=ON  +--enforce_gtid_consistency  diff --git a/mysql-test/t/no_binlog_gtid_next_begin_caused_trx.test b/mysql-test/t/no_binlog_gtid_next_begin_caused_trx.test  new file mode 100644  index 00000000000..71f9833827d  --- /dev/null  +++ b/mysql-test/t/no_binlog_gtid_next_begin_caused_trx.test  @@ -0,0 +1,28 @@  +# ==== Purpose ====  +#  +# When binlog is disabled and @@SESSION.GTID_NEXT == 'UUID:NUMBER',  +# verify that the command 'BEGIN' causes an error  +# 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET' inside  +# an empty/a non-empty transaction, since it causes an implicit  +# commit. We do not save the gtid specified by GTID_NEXT into  +# GLOBAL@gtid_executed in the case.  +#  +# ==== Implementation ====  +#  +# See extra/binlog_tests/gtid_next_begin_caused_trx.test  +#  +# ==== References ====  +#  +# Bug#22130929  GTID_NEXT AND BEGIN BEHAVIOR IS DIFFERENT B/W BINLOG AND BINLOG-LESS SERVER  +#  +  +  +# Test is not required to run against embedded server  +--source include/not_embedded.inc  +# Should be tested against "binlog disabled" server  +--source include/not_log_bin.inc  +  +# Make sure the test is repeatable  +RESET MASTER;  +  +--source extra/binlog_tests/gtid_next_begin_caused_trx.test  diff --git a/sql/rpl_gtid_execution.cc b/sql/rpl_gtid_execution.cc  index ec36772e8c9..65161e2ca97 100644  --- a/sql/rpl_gtid_execution.cc  +++ b/sql/rpl_gtid_execution.cc  @@ -1,4 +1,4 @@  -/* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.  +/* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.      This program is free software; you can redistribute it and/or      modify it under the terms of the GNU General Public License as  @@ -453,7 +453,8 @@ enum_gtid_statement_status gtid_pre_statement_checks(THD *thd)     DBUG_ASSERT(gtid_next->type != AUTOMATIC_GROUP ||                 thd->owned_gtid.is_empty());  -  if (stmt_causes_implicit_commit(thd, CF_IMPLICIT_COMMIT_BEGIN) &&  +  if ((stmt_causes_implicit_commit(thd, CF_IMPLICIT_COMMIT_BEGIN) ||  +       thd->lex->sql_command == SQLCOM_BEGIN) &&         thd->in_active_multi_stmt_transaction() &&         gtid_next->type == GTID_GROUP)     {  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-2659191/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:深沉的少年,转转请注明出处:http://www.cxybcw.com/183566.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code