Hi Darren,

Thanks for explaining the internals.

I already assumed by my 2 small experiments
that this was the case but it's nice to have it confirmed.

With kind regards,
Koen



2014-11-11 12:05 GMT+01:00 Darren Duncan <dar...@darrenduncan.net>:

> On 2014-11-11 2:41 AM, Koen Van Exem wrote:
>
>> I find it a bit confusing because when you create
>> a PRIMARY KEY AUTOINCREMENT then a
>> table named sqlite_sequence is created.
>>
>> According to the SQL (2003) standard multiple sessions are
>> guaranteed to allocate distinct sequence values.
>> (even when rollbacks are involved)
>>
>
> See, this is the source of your confusion.  I will explain.
>
> 1.  Conceptually a sequence generator is just a database table with a
> single row and single column whose value is the integer.  When the
> generator produces the next value, it is like these 2 statements being done
> as an atomic unit: "update seqgentbl set theint = theint + 1" and "select
> theint from seqgentbl".
>
> 2.  The semantics that the SQL standard defines, and is commonplace with
> other SQL DBMSs, is that the aforementioned read+update of seqgentbl
> happens in its own autonomous database transaction that commits
> immediately, and serially prior to the main transaction that called upon
> the sequence generator.  This is why in those cases a rollback of the main
> transaction doesn't rollback the sequence generator, because semantically
> that happened prior to the current transaction and successfully committed.
>
> 3.  SQLite is different such that its read_update of seqgentbl happens
> within the current main transaction rather than a separate one, and
> therefore its actions rollback like anything else.
>
> So SQLite is purposefully being different than the SQL standard.  Partly
> this is because supporting the standard means having to support multiple
> concurrent transactions trying to write the database, in contrast to what
> SQLite actually does which is only supporting one writing transaction at a
> time.
>
> If you want to use SQLite like the SQL standard, then invoke the sequence
> generator first in its own transaction and remember the value, then use
> that remembered value in your main transaction that you explicitly do
> afterwards.
>
> Do you understand what's going on now?
>
> -- Darren Duncan
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>



-- 
Koen Van Exem
+32 3301 3301
+32 498 519999
k...@allors.com
http://www.allors.com
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to