summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-09-15 10:18:01 +0000
committerGerrit Code Review <review@openstack.org>2014-09-15 10:18:01 +0000
commitcc7ae9fecc705924c4dc1d8d104338afc0e2437e (patch)
tree97d70df7bb507061db7ca6bf707322e4edb2230b
parentedbd03e6688aa588d739fd2f7a4d2ae54749e345 (diff)
parent57f499eae5470dcebc10975e8d02ecedea3d624f (diff)
downloadoslo-db-1.0.0.tar.gz
Merge "Add a check for SQLite transactional state"1.0.00.5.0
-rw-r--r--oslo/db/sqlalchemy/session.py13
1 files changed, 11 insertions, 2 deletions
diff --git a/oslo/db/sqlalchemy/session.py b/oslo/db/sqlalchemy/session.py
index 9ab09db..192ad1d 100644
--- a/oslo/db/sqlalchemy/session.py
+++ b/oslo/db/sqlalchemy/session.py
@@ -504,8 +504,17 @@ def _init_events(engine, sqlite_synchronous=True, sqlite_fk=False, **kw):
@sqlalchemy.event.listens_for(engine, "begin")
def _sqlite_emit_begin(conn):
- # emit our own BEGIN
- conn.execute("BEGIN")
+ # emit our own BEGIN, checking for existing
+ # transactional state
+ if 'in_transaction' not in conn.info:
+ conn.execute("BEGIN")
+ conn.info['in_transaction'] = True
+
+ @sqlalchemy.event.listens_for(engine, "rollback")
+ @sqlalchemy.event.listens_for(engine, "commit")
+ def _sqlite_end_transaction(conn):
+ # remove transactional marker
+ conn.info.pop('in_transaction', None)
def _test_connection(engine, max_retries, retry_interval):