On Sat, Apr 28, 2012 at 8:24 AM, Black, Michael (IS) <michael.bla...@ngc.com
> wrote:

> Should another "disadvantage" of WAL mode be added to
> http://www.sqlite.org/draft/wal.html
>
>
>
> Something that says rolled back transactions will cause an abort on any
> reads in progress if shared cache is enabled.
>
>
That would be a disadvantage to shared-cache mode.  The effect is the same
regardless of your journal mode setting.


>
>
>
>
> Michael D. Black
>
> Senior Scientist
>
> Advanced Analytics Directorate
>
> Advanced GEOINT Solutions Operating Unit
>
> Northrop Grumman Information Systems
>
> ________________________________
> From: sqlite-users-boun...@sqlite.org [sqlite-users-boun...@sqlite.org]
> on behalf of Richard Hipp [d...@sqlite.org]
> Sent: Friday, April 27, 2012 6:04 PM
> To: General Discussion of SQLite Database
> Subject: EXT :Re: [sqlite] SQLite 3.7.11 behavioral change from 3.7.10
> with concurrency -- bug?? -- test case!
>
> On Fri, Apr 27, 2012 at 6:45 PM, Pavel Ivanov <paiva...@gmail.com> wrote:
>
> > > If two database connections share the same cache, and one connection
> > rolls
> > > back, that means it will be changing cache content out from under the
> > other
> > > database connection, so any queries ongoing in the other connection
> have
> > to
> > > abort.
> >
> > Richard,
> >
> > Could you please explain this? I understand that this statement is
> > true when read_uncommitted is set to 1. But without it in my
> > understanding two connections should behave as if they don't have
> > shared cache and select query in one connection shouldn't rely on any
> > pages changed in another connection. Thus it seems there's no need to
> > abort any queries. In what part this statement is not true? What
> > changed parts select query can rely on?
> >
>
> In theory, you probably could get it to work such that a rollback in one
> connection does not force aborts in another connection as long as
> read_uncommitted is not set.  But that is yet another special case to write
> code for, to test, and to be a magnet for database-corruption bugs.  I
> don't want to go there.  The whole shared cache mechanism is way too
> complicated already, even without introducing yet another corner case
> optimization.
>
>
>
> >
> >
> > Pavel
> >
> >
> > On Fri, Apr 27, 2012 at 4:38 PM, Richard Hipp <d...@sqlite.org> wrote:
> > > On Fri, Apr 27, 2012 at 3:50 PM, Brad House <b...@monetra.com> wrote:
> > >
> > >> On 04/27/2012 02:00 PM, Brad House wrote:
> > >>
> > >>>
> > >>>  Only the connection that does the rollback has its queries aborted.
> > >>>>
> > >>>
> > >>> That is not the behavior I am seeing in 3.7.11, but was the behavior
> > >>> I saw in 3.7.10.
> > >>>
> > >>>  If you are seeing other connections get queries aborted, that is
> > >>>> something
> > >>>> new that I have not seen before and will need to investigate.
> > >>>>
> > >>>
> > >>> Correct.
> > >>>
> > >>>  If you do a ROLLBACK in the middle of a query, why would you ever
> > want to
> > >>>> keep going with that query? What would you expect to see?
> > >>>>
> > >>>
> > >>> I wouldn't expect to keep going on that query.
> > >>>
> > >>> I'll try to write a test case.
> > >>>
> > >>> -Brad
> > >>>
> > >>
> > >>
> > >> As promised, I've attached a test case which uses the SQLITE
> > amalgamation.
> > >>
> > >
> > > Disable shared cache mode and you should be good to go.
> > >
> > > If two database connections share the same cache, and one connection
> > rolls
> > > back, that means it will be changing cache content out from under the
> > other
> > > database connection, so any queries ongoing in the other connection
> have
> > to
> > > abort.
> > >
> > > Two database connections in shared cache mode behave like a single
> > database
> > > connection in many ways, especially when you are talking about the
> cache
> > > that they share.
> > >
> > >
> > >
> > >
> > >
> > >>
> > >> Sorry about how ugly the code is, I know it is bad, but it should
> prove
> > the
> > >> point.   I don't know if I'd consider this a _minimal_ test case, but
> I
> > >> tried to simulate everything we do like the options used to build the
> > >> amalgamation,
> > >> and the fact that we register threading callbacks.
> > >>
> > >> This test case creates a table, adds 100 rows, then spawns 2 threads
> > >> each with their own independent db handle.
> > >>
> > >> One is a reader, the other is a writer.  It tries to make sure the
> > >> reader obtains its read lock on the table first, and cycles through
> the
> > >> rows.  The writer simultaneously tries to insert another row... I've
> > >> added some synchronization between the threads on sqlite3_step() so
> > >> they go back and forth (failure happens quicker this way).
> > >>
> > >> What you'll see happen on 3.7.11 is the writer rolls back, and all of
> > >> a sudden, the reader is aborted (with message:
> > >> my_sqlite3_query(): sqlite3 returned 4: abort due to ROLLBACK).
> > >>
> > >> On 3.7.10, the writer does not cause the reader to rollback ... just
> > >> the writer keeps rolling back until the reader finishes, then the
> writer
> > >> is able to retry and complete.
> > >>
> > >> When compiling, copy sqlite3.c and sqlite3.h from the amalgamation
> into
> > >> the same directory as the source file and run (on Linux):
> > >>
> > >> gcc -Wall -W -o sqlite_test sqlite_test.c -lpthread -ldl
> > >>
> > >> (yeah, it has an #include "sqlite3.c" ... bad, but if you look at
> > >>  it, you'll see why).
> > >>
> > >> Then to run it, just run:
> > >>
> > >> ./sqlite_test
> > >>
> > >> It will create a "./db.sqlite" database.  This db must be removed for
> > >> each subsequent run or it will error out with a create table failure.
> > >>
> > >> Thanks.
> > >> -Brad
> > >>
> > >> _______________________________________________
> > >> sqlite-users mailing list
> > >> sqlite-users@sqlite.org
> > >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> > >>
> > >>
> > >
> > >
> > > --
> > > D. Richard Hipp
> > > d...@sqlite.org
> > > _______________________________________________
> > > sqlite-users mailing list
> > > sqlite-users@sqlite.org
> > > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@sqlite.org
> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> >
>
>
>
> --
> D. Richard Hipp
> d...@sqlite.org
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>



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

Reply via email to