From ca48cb81c4191e5ce94bbc57af96323045ac2c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 13 Nov 2018 17:34:03 +0200 Subject: [PATCH] Revert autcommit to 1 if it is the first SELECT If: * client wants autocommit=0 * enforce_autocommit_on_reads=false * there is no transaction * this seems to be the first query, and a SELECT not FOR UPDATE Action: * switch back to autcommit=1 --- lib/MySQL_Session.cpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 86d0ec64a..4e10873b2 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1343,6 +1343,24 @@ bool MySQL_Session::handler_again___verify_backend_autocommit() { } NEXT_IMMEDIATE_NEW(CHANGING_AUTOCOMMIT); } + } else { + if (autocommit == false) { // also IsAutoCommit==false + if (mysql_thread___enforce_autocommit_on_reads == false) { + if (mybe->server_myds->myconn->IsActiveTransaction() == false) { + if (CurrentQuery.is_select_NOT_for_update()==true) { + // client wants autocommit=0 + // enforce_autocommit_on_reads=false + // there is no transaction + // this seems to be the first query, and a SELECT not FOR UPDATE + // we will switch back to autcommit=1 + if (status == PROCESSING_QUERY) { + previous_status.push(PROCESSING_QUERY); + NEXT_IMMEDIATE_NEW(CHANGING_AUTOCOMMIT); + } + } + } + } + } } return false; } @@ -2019,7 +2037,22 @@ bool MySQL_Session::handler_again___status_CHANGING_AUTOCOMMIT(int *_rc) { if (myds->mypolls==NULL) { thread->mypolls.add(POLLIN|POLLOUT, mybe->server_myds->fd, mybe->server_myds, thread->curtime); } - int rc=myconn->async_set_autocommit(myds->revents, autocommit); + bool ac = autocommit; + if (autocommit == false) { // also IsAutoCommit==false + if (mysql_thread___enforce_autocommit_on_reads == false) { + if (mybe->server_myds->myconn->IsActiveTransaction() == false) { + if (CurrentQuery.is_select_NOT_for_update()==true) { + // client wants autocommit=0 + // enforce_autocommit_on_reads=false + // there is no transaction + // this seems to be the first query, and a SELECT not FOR UPDATE + // we will switch back to autcommit=1 + ac = true; + } + } + } + } + int rc=myconn->async_set_autocommit(myds->revents, ac); if (rc==0) { st=previous_status.top(); previous_status.pop();