mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Backport of:
------------------------------------------------------------ revno: 2630.13.16 committer: Davi Arnaut <Davi.Arnaut@Sun.COM> branch nick: WL#4284 timestamp: Sat 2008-07-26 13:38:20 -0300 message: WL#4284: Transactional DDL locking SQL statements' effect on transactions. Currently the MySQL server and its storage engines are not capable of rolling back operations that define or modify data structures (also known as DDL statements) or operations that alter any of the system tables (the mysql database). Allowing these group of statements to participate in transactions is unfeasible at this time (since rollback has no effect whatsoever on them) and goes against the design of our metadata locking subsystem. The solution is to issue implicit commits before and after those statements execution. This effectively confines each of those statements to its own special transaction and ensures that metadata locks taken during this special transaction are not leaked into posterior statements/transactions. mysql-test/include/commit.inc: Alter table rename was not committing the normal transaction at the end of its execution, and as a consequence, the commit was being issued in the next DDL command (rename table) that happened to end the active transaction. Other changes are to take into account the implicit commits issued before and after the DDL command execution. mysql-test/include/implicit_commit_helper.inc: Add auxiliary test that shows if a statement issued a implicit commit. mysql-test/r/commit_1innodb.result: Update test case result. mysql-test/r/implicit_commit.result: Test implicit commit behavior of some SQL commands. mysql-test/t/implicit_commit.test: Test implicit commit behavior of some SQL commands. sql/events.cc: Transaction is now ended before the command execution. sql/mysql_priv.h: Add flags array for server commands and remove historical left over. sql/sql_class.h: Add flags to control when to issue implicit commits before and after a command execution. sql/sql_delete.cc: A implicit commit is issued at the end of truncate statements. sql/sql_parse.cc: Mark commands that need implicit commits before and after their executions. The implicit commits of the statement and the normal transaction are now issued regardless of the user access privileges. sql/sql_table.cc: A implicit commit is now issued before admin commands. tests/mysql_client_test.c: Test that COM_REFRESH issues a implicit commit.
This commit is contained in:
@ -3152,6 +3152,36 @@ public:
|
||||
joins are currently prohibited in these statements.
|
||||
*/
|
||||
#define CF_REEXECUTION_FRAGILE (1U << 5)
|
||||
/**
|
||||
Implicitly commit before the SQL statement is executed.
|
||||
|
||||
Statements marked with this flag will cause any active
|
||||
transaction to end (commit) before proceeding with the
|
||||
command execution.
|
||||
|
||||
This flag should be set for statements that probably can't
|
||||
be rolled back or that do not expect any previously metadata
|
||||
locked tables.
|
||||
*/
|
||||
#define CF_IMPLICT_COMMIT_BEGIN (1U << 6)
|
||||
/**
|
||||
Implicitly commit after the SQL statement.
|
||||
|
||||
Statements marked with this flag are automatically committed
|
||||
at the end of the statement.
|
||||
|
||||
This flag should be set for statements that will implicitly
|
||||
open and take metadata locks on system tables that should not
|
||||
be carried for the whole duration of a active transaction.
|
||||
*/
|
||||
#define CF_IMPLICIT_COMMIT_END (1U << 7)
|
||||
/**
|
||||
CF_IMPLICT_COMMIT_BEGIN and CF_IMPLICIT_COMMIT_END are used
|
||||
to ensure that the active transaction is implicitly committed
|
||||
before and after every DDL statement and any statement that
|
||||
modifies our currently non-transactional system tables.
|
||||
*/
|
||||
#define CF_AUTO_COMMIT_TRANS (CF_IMPLICT_COMMIT_BEGIN | CF_IMPLICIT_COMMIT_END)
|
||||
|
||||
/**
|
||||
Diagnostic statement.
|
||||
@ -3163,6 +3193,23 @@ public:
|
||||
*/
|
||||
#define CF_DIAGNOSTIC_STMT (1U << 8)
|
||||
|
||||
/* Bits in server_command_flags */
|
||||
|
||||
/**
|
||||
Skip the increase of the global query id counter. Commonly set for
|
||||
commands that are stateless (won't cause any change on the server
|
||||
internal states).
|
||||
*/
|
||||
#define CF_SKIP_QUERY_ID (1U << 0)
|
||||
|
||||
/**
|
||||
Skip the increase of the number of statements that clients have
|
||||
sent to the server. Commonly used for commands that will cause
|
||||
a statement to be executed but the statement might have not been
|
||||
sent by the user (ie: stored procedure).
|
||||
*/
|
||||
#define CF_SKIP_QUESTIONS (1U << 1)
|
||||
|
||||
/* Functions in sql_class.cc */
|
||||
|
||||
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var);
|
||||
|
Reference in New Issue
Block a user