On 9/14/2012 10:36 AM, Pavel Ivanov wrote:
On Fri, Sep 14, 2012 at 5:58 AM, Igor Tandetnik <itandet...@mvps.org> wrote:
Wait a minute. If "statement-level read consistency" only applies to two queries in 
different transactions, what bearing, if any, does it have on your example of "open, fetch, 
update, fetch"? There, everything happens in the same transaction. I'm thoroughly confused.

I'm sorry, I made that example before I carefully re-read Petite's
email and understood what you are concerned about.

I'm not actually concerned about anything. It is difficult for me to possibly care less about the intricacies of Oracle's transaction management. It's just that Petite asked whether SQLite supports something called "statement-level read consistency", and I've never heard of such a beast, and was confused by the formal definition thereof that Petite cited.

Let me see if I understand it. Oracle (optionally?) provides transaction isolation levels weaker than "serializable", whereby transaction A may see changes made by another transaction B, committed after A started. However, it guarantees that any individual statement within A, during its lifetime, will see data either as it existed before B committed, or as it exists afterward, but never a mix of the two. Whereas two identical statements executed one after another may very well observe different data. This is what's called "statement-level read consistency".

Since SQLite only provides serializable transaction isolation level, no statement in transaction A will ever see any changes made by transaction B. This is a strictly stronger guarantee than "statement-level read consistency", rendering moot the question of whether SQLite supports the same.

In addition to, and independently of, all of the above, Oracle provides a similar guarantee (whose name was not mentioned in this thread) that a statement A within a transaction will see all changes by another statement B within the same transaction if B completes before A starts; and will not see any changes made by yet third statement C, still within the same transaction, if C completes after A starts (even if C starts while A was in progress). SQLite only provides half of that guarantee: statement A will see the changes made by B; it may see none, some, or all changes made by C, in an unpredictable way.

Thus, in SQLite it is best to avoid modifying the same data that an outstanding SELECT statement is iterating over, as the outcome of such a modification is unpredictable.


Does this sound right to you?
--
Igor Tandetnik

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to