Hi Dan, On Mar 4, 2009, at 9:21 AM, Dan wrote:
> > On Mar 5, 2009, at 12:10 AM, Tito Ciuro wrote: > >> Hello, >> >> On Mar 4, 2009, at 6:06 AM, D. Richard Hipp wrote: >> >>> See http://www.sqlite.org/atomiccommit.html and especially section >>> 9.0 >>> "Things That Can Go Wrong" >> >> Reading the above link, I'm curious about a specific case: 4.2 Hot >> Rollback Journals. It states that: >> >> [...] >> The first time that any SQLite process attempts to access the >> database >> file, it obtains a shared lock as described in section 3.2 above. But >> then it notices that there is a rollback journal file present. SQLite >> then checks to see if the rollback journal is a "hot journal". >> [...] >> >> SQLite's documentation in http://www.sqlite.org/lockingv3.html states >> the following about a shared lock: >> >> [...] >> The database may be read but not written. Any number of processes can >> hold SHARED locks at the same time, hence there can be many >> simultaneous readers. But no other thread or process is allowed to >> write to the database file while one or more SHARED locks are active. >> [...] >> >> So, if when SQLite attempts to access the data file for the first >> time >> (thread T1) and obtains a shared lock, it seems that there's a window >> of opportunity for secondary thread (T2) to obtain another shared >> lock. In this case, T1 would not obtain an exclusive lock until T2 >> has >> completed reading. This would potentially leave T2 with damaged/ >> inconsistent data. Once T2's shared lock was relinquished, T1 would >> proceed to rollback the hot journal. >> >> Shouldn't the first connection obtain an exclusive lock right away >> instead and then perform the testing for the existence of a hot >> journal? I'm probably mistaken, but this is what I gather from the >> documentation mentioned above. > > After obtaining a shared-lock, SQLite tests for the existence of > a hot-journal file. The test for a hot-journal file is that the > journal file exists and that no other connection holds a RESERVED > or PENDING lock on the database file. We know no other process > is holding an EXCLUSIVE lock on the database file, since we are > holding a SHARED lock. > > If it determines that there is a hot-journal file in the file system, > SQLite obtains an EXCLUSIVE lock on the database file. It does > not obtain a RESERVED or PENDING lock first like it does normally, > but jumps straight to EXCLUSIVE. > > If the EXCLUSIVE lock is obtained Ok, roll back the journal file. > If not, then release all locks and return SQLITE_BUSY. If the > EXCLUSIVE lock cannot be obtained, then some other process must > have obtained a SHARED lock. The other process will also try to > roll back the hot-journal. By releasing all locks, hopefully > we can get out of the other processes way fast enough to allow it > to obtain the EXCLUSIVE lock and roll back the journal file. > > The key is that at no point is it possible for a second process > to conclude that the database is valid when there is really a > hot-journal file that requires rollback in the file-system. If > there are multiple clients all trying to access the database at > once then a few operations might return SQLITE_BUSY, but eventually > one of the clients will successfully obtain the EXCLUSIVE lock > and roll back the hot-journal. > > Dan. Makes perfect sense (especially the last paragraph). Thanks for taking the time to write a detailed explanation. Regards, -- Tito _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users