The attached patch seems to do it. The thinking-out-loud patch in my earlier email wasn't right (I'd kept an interim edit from the PRAGMA-based approach).
I can't think of a reason to have EXCLUSIVE as the default. -scott On 10/10/07, Scott Hess <[EMAIL PROTECTED]> wrote: > On 10/10/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > > "Scott Hess" <[EMAIL PROTECTED]> wrote: > > > We've just had a bit of discussion on the Google Gears team about some > > > cases where failure of an UPDATE/DELETE/INSERT while within a > > > transaction is unexpected. Well, that and that when you're > > > multi-threaded you can hit some hard-to-understand cases. > > > > > > One suggestion was to use BEGIN IMMEDIATE for explicit transactions, > > > rather than BEGIN. And it seemed to us like that might be a > > > reasonable default, given that Gears encourages multiple threads > > > hitting the same database. > > > > > > It looks pretty easy to make this happen (one-line mod to parse.y), > > > and BEGIN DEFERRED is supported syntax for those who really do mean > > > that. Does anyone have a strong argument for why we're descending > > > into a pit of despair by considering this? > > > > Many (most?) of the other teams using SQLite in situations > > similar to Gears have their own separate methods for starting, > > committing, and rolling back transactions. They don't run > > BEGIN, COMMIT, or ROLLBACK statements - they call their own > > built-in methods which in turn runs BEGIN, COMMIT, and > > ROLLBACK on the user's behalf. If you used this approach, > > then you could easily revise your method to call BEGIN IMMEDIATE > > instead of just BEGIN. You could also do the BUSY retry > > handling that Ken suggests. > > Indeed, there has been past discussion about whether we should do some > sort of transaction API which integrated with the language (for > instance, automating ROLLBACK on uncaught exceptions). It may be that > this is the time for that to come back to the fore. > > > If you really want to use SQL instead of a separate method, > > I would suggest a compile-time switch to make IMMEDIATE the > > default in place of DEFERRED - not a pragma. We already have > > way too many pragmas. I will be happy to add a compile-time > > option to make IMMEDATE the default behavior. I will require > > rather more convincing to add another pragma. > > That's a reasonable position to take. For Gears, it would be super > easy to just make the change directly to parse.y, and I _think_ that I > understand things well enough to implement > SQLITE_TRANSACTION_DEFAULT_IMMEDIATE or something along those lines. > > Thinking out loud, it looks to me like the change would be something like: > > cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} > trans_opt ::= . > trans_opt ::= TRANSACTION. > trans_opt ::= TRANSACTION nm. > %type transtype {int} > + %ifdef SQLITE_TRANSACTION_DEFAULT_IMMEDIATE > + transtype(A) ::= . {A = TK_IMMEDIATE;} > + %endif > + %ifndef SQLITE_TRANSACTION_DEFAULT_IMMEDIATE > transtype(A) ::= . {A = 0;} > + %endif > transtype(A) ::= DEFERRED(X). {A = @X;} > transtype(A) ::= IMMEDIATE(X). {A = @X;} > transtype(A) ::= EXCLUSIVE(X). {A = @X;} > cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} > cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} > cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} > > I can wrap that up better tomorrow. And maybe even think of a better > define than SQLITE_TRANSACTION_DEFAULT_IMMEDIATE :-). > > -scott >
Index: src/parse.y =================================================================== RCS file: /sqlite/sqlite/src/parse.y,v retrieving revision 1.234 diff -u -r1.234 parse.y --- src/parse.y 21 Aug 2007 10:44:16 -0000 1.234 +++ src/parse.y 11 Oct 2007 17:39:57 -0000 @@ -113,7 +113,12 @@ trans_opt ::= TRANSACTION. trans_opt ::= TRANSACTION nm. %type transtype {int} +%ifdef SQLITE_TRANSACTION_DEFAULT_IMMEDIATE +transtype(A) ::= . {A = TK_IMMEDIATE;} +%endif SQLITE_TRANSACTION_DEFAULT_IMMEDIATE +%ifndef SQLITE_TRANSACTION_DEFAULT_IMMEDIATE transtype(A) ::= . {A = TK_DEFERRED;} +%endif SQLITE_TRANSACTION_DEFAULT_IMMEDIATE transtype(A) ::= DEFERRED(X). {A = @X;} transtype(A) ::= IMMEDIATE(X). {A = @X;} transtype(A) ::= EXCLUSIVE(X). {A = @X;}
----------------------------------------------------------------------------- To unsubscribe, send email to [EMAIL PROTECTED] -----------------------------------------------------------------------------