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

Reply via email to