PS: thank you for your long answer! It's an interesting read and I think I will learn things.
But if "read transaction" is used dozens of times through the documentation you shouldn't just say there is no such thing as a read transaction if the documentation claims otherwise at so many places. If there really is no such thing as a read transaction then the documentation should be completely cleaned of that term to reduce confusion. kind regards, Kira Backes On Mon, 12 Aug 2019 at 13:11, Olivier Mascia <[email protected]> wrote: > > > Le 12 août 2019 à 12:11, Kira Backes <[email protected]> a écrit : > > > > I have one question which popped up in my other thread: What are the > > differences between a SHARED lock and a READ transaction? Are there > > any differences at all? If so, are there also differences for WAL > > databases? > > There is no such thing as a "READ transaction". > > There are transactions (DEFERRED, IMMEDIATE or EXCLUSIVE) which you can > control and there are database locks (NONE, SHARED, RESERVED, EXCLUSIVE) > which you don't control (directly). > > Transactions are either explicitly controlled by you (BEGIN, COMMIT, > ROLLBACK) or implicitly wrapping isolated statements when there is no > explicit transaction (which is also referred to as auto-commit mode). > > The big picture (without the numerous details) looks like this: > > - upon reading, a SHARED lock will be requested ; > - upon writing, a RESERVED lock will be requested (or a SHARED one upgraded > to RESERVED) ; > > I'm intentionally leaving out the details (behaviours when not being able to > acquire one of these locks). > > A BEGIN DEFERRED enters a transaction, but does not yet request any lock. It > will happen on the first read or write. > A BEGIN IMMEDIATE enters a transaction, and does request a RESERVED lock > immediately, showing your intent to write. > A BEGIN EXCLUSIVE enters a transaction, and does request an EXCLUSIVE lock > immediately. > A COMMIT will either abandon the SHARED lock (if no writes occurred during > the transaction) or request an EXCLUSIVE lock. It will release locks when > done. > A ROLLBACK will abandon locks. > > What looks the most as a "READ transaction" is a transaction started with > BEGIN DEFERRED which then takes care of not executing any statement writing > to the DB. It will then seek a SHARED lock, and simply abandon it on COMMIT > or ROLLBACK. > > Non-WAL: > The existence of a SHARED lock will block a writer (which has got a RESERVED > lock) to upgrade to EXCLUSIVE when attempting COMMIT. SQLITE_BUSY might then > get returned from the attempt to execute COMMIT. The transaction state is not > lost. And assuming the SHARED locks from readers disappear, COMMIT can be > retried and succeeds. > > WAL: > The existence of SHARED locks won't block a writer attempting COMMIT. This is > because the readers won't see the changes made by the writer until they > COMMIT/ROLLBACK. WAL brings stable, long-standing view of the DB to > connections which are only reading, for the duration of their transaction. > This won't stop another connection to write and commit. Albeit the WAL file > might grow quite indefinitely if there are always readers within > long-standing transactions. > > This is quite an over-simplified view at the subject, but it should get you > the big picture. The documentation has all the details. > > — > Best Regards, Meilleures salutations, Met vriendelijke groeten, Mit besten > Grüßen, > Olivier Mascia > > > _______________________________________________ > sqlite-users mailing list > [email protected] > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list [email protected] http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

