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();