You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Documentation about sqlite3 isolation_level #52392
I'll paste code for ctx_manager_2.py here. This is a new file, I could not include it as a diff:
importsqlite3classMyConn(sqlite3.Connection):
def__enter__(self):
self.execute("BEGIN")
returnselfdef__exit__(self,exc_type,exc_info,traceback):
ifexc_typeisNone:
self.execute("COMMIT")
else:
self.execute("ROLLBACK")
conn=sqlite3.connect(':memory:',factory=MyConn)
conn.isolation_level=Nonewithconn:
conn.execute("create table a ( i integer ) ")
conn.execute("insert into a values (1)")
try:
withconn:
conn.execute("insert into a values (2)")
conn.execute("savepoint sp1")
conn.execute("insert into a values (3)")
conn.execute("rollback to sp1")
conn.execute("insert into a values (4)")
print"Before rollback: 1,2,4"forrowinconn.execute("select * from a"):
printrow[0] # prints 1,2,4raiseExceptionexcept:
passprint"After rollback: 1"forrowinconn.execute("select * from a"):
printrow[0] # prints 1
If the content of the patch is correct, it looks ready to apply, with only a touch of editing. Do we have a resident expert of sqlite3? Or Laszlo, do you have a reference for the statements made?
If the content of the patch is correct, it looks ready to apply, with only
a touch of editing. Do we have a resident expert of sqlite3? Or Laszlo, do
you have a reference for the statements made?
There you can find an example with SQL statements, showing the problem.
Ryan Kelly wrote the following:
<quote>
I have a theory, based on a quick perusal of the sqlite3 bindings
source.
The bindings think that "SAVEPOINT sp1" is a "non-DML, non-query"
statement. So when isolation_level is something other than None, this
statement implicitly commits the current transaction and throws away
your savepoints!
</quote>
So the problem is with the sqlite binding code, not sqlite itself. I'm not
an expert in C, so I'm not sure I can help more.
I believe this patch is correct in essence, but I think it would be helpful to clarify the explanation of what autocommit mode is. I'll work on an updated patch.
It could also be considered a bug that the standard context manager does not support autocommit mode, but I'm going to treat that as a separate bug. Perhaps a fix will come out of fixing bpo-10740.
Here is a revised patch. I am leaving out the changes relating to the transaction manager. It turns out that the transaction manager doesn't do anything useful even if isolation_level is not None. I'm going to open a new issue to discuss the best way to fix it, and any documentation changes relating to any leftover brokenness will be part of that issue.
sqlite_transaction_doc.patch looks good to me and applies cleanly to current default branch. One minor note: It would be nice to document that the default mode is "BEGIN DEFERRED" in Connection.isolation_level documentation.
Activity
nagylzs commentedon Mar 15, 2010
Clarify what isolation_level does, and how to use it, and why connections do not commit/rollback in some cases.
Details here:
http://mail.python.org/pipermail/python-list/2010-March/1239374.html
I'll paste code for ctx_manager_2.py here. This is a new file, I could not include it as a diff:
terryjreedy commentedon Jul 11, 2010
If the content of the patch is correct, it looks ready to apply, with only a touch of editing. Do we have a resident expert of sqlite3? Or Laszlo, do you have a reference for the statements made?
nagylzs commentedon Jul 11, 2010
2010/7/11 Terry J. Reedy <report@bugs.python.org>
Sorry, the only reference I have is that mailing list thread (
http://mail.python.org/pipermail/python-list/2010-March/1239374.html ).
There you can find an example with SQL statements, showing the problem.
Ryan Kelly wrote the following:
<quote>
I have a theory, based on a quick perusal of the sqlite3 bindings
source.
The bindings think that "SAVEPOINT sp1" is a "non-DML, non-query"
statement. So when isolation_level is something other than None, this
statement implicitly commits the current transaction and throws away
your savepoints!
</quote>
So the problem is with the sqlite binding code, not sqlite itself. I'm not
an expert in C, so I'm not sure I can help more.
Thanks,
Laszlo
ezio-melotti commentedon Nov 18, 2012
Can someone review this patch?
(There is a typo: s/The/This/)
bitdancer commentedon Jan 11, 2013
I believe this patch is correct in essence, but I think it would be helpful to clarify the explanation of what autocommit mode is. I'll work on an updated patch.
It could also be considered a bug that the standard context manager does not support autocommit mode, but I'm going to treat that as a separate bug. Perhaps a fix will come out of fixing bpo-10740.
bitdancer commentedon Jan 14, 2013
Here is a revised patch. I am leaving out the changes relating to the transaction manager. It turns out that the transaction manager doesn't do anything useful even if isolation_level is not None. I'm going to open a new issue to discuss the best way to fix it, and any documentation changes relating to any leftover brokenness will be part of that issue.
bitdancer commentedon Jan 14, 2013
I misspoke, the transaction manager does do something useful in non-None isolation level. I'm still going to open a bug about isolation_level None.
bitdancer commentedon Jan 14, 2013
Opened bpo-16958 for the transaction manager problem.
berkerpeksag commentedon Aug 26, 2016
sqlite_transaction_doc.patch looks good to me and applies cleanly to current default branch. One minor note: It would be nice to document that the default mode is "BEGIN DEFERRED" in Connection.isolation_level documentation.
berkerpeksag commentedon Nov 25, 2016
The patch needs to be updated to address changes in bpo-10740 so I'm moving the stage field back to 'patch review'.
fschulze commentedon Nov 25, 2016
The documentation patch is a definite improvement.
zooba commentedon Jul 29, 2018
New changeset a71fed0 by Steve Dower (Berker Peksag) in branch 'master':
bpo-8145: Improve isolation_level documentation (GH-8499)
a71fed0
zooba commentedon Jul 29, 2018
New changeset 94972d5 by Steve Dower (Miss Islington (bot)) in branch '3.6':
bpo-8145: Improve isolation_level documentation (GH-8499)
94972d5
zooba commentedon Jul 29, 2018
New changeset 3dc8cdf by Steve Dower in branch '3.7':
bpo-8145: Improve isolation_level documentation (GH-8499)
3dc8cdf