Mercurial > hg > MonetDB
changeset 86187:aec3dfc4d53b Jan2022
Always reset session's transaction to parent when child is destroyed.
| author | Aris Koning <aris.koning@monetdbsolutions.com> |
|---|---|
| date | Thu, 28 Jul 2022 16:17:07 +0200 |
| parents | 4fc3f6aa9a8f |
| children | ec241b102d85 daea8245a12f |
| files | sql/server/sql_mvc.c |
| diffstat | 1 files changed, 8 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -562,11 +562,10 @@ mvc_commit(mvc *m, int chain, const char while (tr->parent != NULL && ok == SQL_OK) { if ((ok = sql_trans_commit(tr)) == SQL_ERR) GDKfatal("%s transaction commit failed; exiting (kernel error: %s)", operation, GDKerrbuf); - tr = sql_trans_destroy(tr); + m->session->tr = tr = sql_trans_destroy(tr); } while (tr->parent != NULL) - tr = sql_trans_destroy(tr); - m->session->tr = tr; + m->session->tr = tr = sql_trans_destroy(tr); if (ok != SQL_OK) msg = createException(SQL, "sql.commit", SQLSTATE(40001) "%s transaction is aborted because of concurrency conflicts, will ROLLBACK instead", operation); } @@ -640,7 +639,7 @@ mvc_rollback(mvc *m, int chain, const ch /* make sure we do not reuse changed data */ if (!list_empty(tr->changes)) tr->status = 1; - tr = sql_trans_destroy(tr); + m->session->tr = tr = sql_trans_destroy(tr); } /* start a new transaction after rolling back */ if (!(m->session->tr = tr = sql_trans_create(m->store, tr, name))) { @@ -657,8 +656,7 @@ mvc_rollback(mvc *m, int chain, const ch } else { /* first release all intermediate savepoints */ while (tr->parent != NULL) - tr = sql_trans_destroy(tr); - m->session-> tr = tr; + m->session-> tr = tr = sql_trans_destroy(tr); /* make sure we do not reuse changed data */ if (!list_empty(tr->changes)) tr->status = 1; @@ -716,10 +714,9 @@ mvc_release(mvc *m, const char *name) /* commit all intermediate savepoints */ if (sql_trans_commit(tr) != SQL_OK) GDKfatal("release savepoints should not fail"); - tr = sql_trans_destroy(tr); + m->session->tr = tr = sql_trans_destroy(tr); } - _DELETE(tr->name); /* name will no longer be used */ - m->session->tr = tr; + _DELETE(m->session->tr->name); /* name will no longer be used */ m->session->status = tr->status; if (!(m->session->schema = find_sql_schema(m->session->tr, m->session->schema_name))) { msg = createException(SQL, "sql.release", SQLSTATE(40000) "RELEASE: finished successfully, but the session's schema could not be found on the current transaction"); @@ -835,7 +832,7 @@ mvc_reset(mvc *m, bstream *rs, stream *w if (tr && tr->parent) { assert(m->session->tr->active == 0); while (tr->parent->parent != NULL) - tr = sql_trans_destroy(tr); + m->session->tr = tr = sql_trans_destroy(tr); } reset = sql_session_reset(m->session, 1 /*autocommit on*/); if (tr && !reset) @@ -889,7 +886,7 @@ mvc_destroy(mvc *m) if (m->session->tr->active) (void)sql_trans_end(m->session, SQL_ERR); while (tr->parent) - tr = sql_trans_destroy(tr); + m->session->tr = tr = sql_trans_destroy(tr); } sql_session_destroy(m->session);
