On Oct 22, 2009, at 5:21 AM, Tom Broadbent wrote: > if thread 1 opens a read cursor in read uncommitted mode it can > block a write lock? i thought the read happens w/o a lock?
If using read-uncommitted mode, a reader thread will not block a writer thread that is using the same shared-cache. Except, it does block a writer from modifying the database schema. Dan. > > -----Original Message----- > From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-boun...@sqlite.org > ] On Behalf Of John Crenshaw > Sent: Wednesday, October 21, 2009 12:03 PM > To: General Discussion of SQLite Database > Subject: Re: [sqlite] commit time > > Good, a single write thread saves you all the hassle involved with > yielding. Unfortunately, even without multiple writers blocking is > still > possible. If thread 1 opens a cursor, and thread 2 tries to write > before > that cursor has been closed, it will return SQLITE_LOCKED. Since any > read query will return a cursor, there is always a possibility for > blocking, and you need to handle SQLITE_LOCKED. > > John > > -----Original Message----- > From: sqlite-users-boun...@sqlite.org > [mailto:sqlite-users-boun...@sqlite.org] On Behalf Of Tom Broadbent > Sent: Wednesday, October 21, 2009 2:09 PM > To: General Discussion of SQLite Database > Subject: Re: [sqlite] commit time > > very good. i don't anticipate multiple writers so this should be > pretty > simple. > > -----Original Message----- > From: sqlite-users-boun...@sqlite.org > [mailto:sqlite-users-boun...@sqlite.org] On Behalf Of John Crenshaw > Sent: Wednesday, October 21, 2009 9:15 AM > To: General Discussion of SQLite Database > Subject: Re: [sqlite] commit time > > Yes, you have to call sqlite3_enable_shared_cache before opening any > database connections, then execute "PRAGMA read_uncommitted = true;" > on > each connection. Blocking can still happen in some situations, but you > can handle it as I described in my original reply. > > John > > -----Original Message----- > From: sqlite-users-boun...@sqlite.org > [mailto:sqlite-users-boun...@sqlite.org] On Behalf Of Tom Broadbent > Sent: Wednesday, October 21, 2009 12:05 PM > To: General Discussion of SQLite Database > Subject: Re: [sqlite] commit time > > > it sounds like this is the feature you recommend using: > > "A database connection in read-uncommitted mode _does not attempt to > obtain read-locks before reading_ from database tables as described > above. This can lead to inconsistent query results if another database > connection modifies a table while it is being read, but it also means > that a read-transaction opened by a connection in read-uncommitted > mode > can neither block nor be blocked by any other connection." > > this is precisely what i need. thanks very much. > > ________________________________________ > From: sqlite-users-boun...@sqlite.org [sqlite-users- > boun...@sqlite.org] > On Behalf Of John Crenshaw [johncrens...@priacta.com] > Sent: Tuesday, October 20, 2009 7:18 PM > To: General Discussion of SQLite Database > Subject: Re: [sqlite] commit time > > Sounds like a great candidate for shared cache with PRAGMA > read_uncommitted = true. > > If other threads may also need a write lock on that table, you should > handle SQLITE_LOCKED by incrementing a waiter count and calling > sqlite3_unlock_notify. The thread doing the inserting can check to see > if anybody is waiting (blocked) and yield by committing the current > transaction and waiting for the blocked thread to unblock. Be aware, > you > should also close any open cursors before yielding, because open > cursors > will prevent write locks and you'll waste time yielding for nothing. > > John > > -----Original Message----- > From: sqlite-users-boun...@sqlite.org > [mailto:sqlite-users-boun...@sqlite.org] On Behalf Of Tom Broadbent > Sent: Tuesday, October 20, 2009 8:05 PM > To: sqlite-users@sqlite.org > Subject: [sqlite] commit time > > i have a simple join table containing two ids from two other > tables. i > have an index on each of the ids in the join table. > > CREATE TABLE ContentWordItem (word_id INT, item_id INT); > > CREATE INDEX idx_ContentWordItem_word ON ContentWordItem(word_id); > // index to perform fast queries by word_id > > CREATE INDEX idx_ContentWordItem_item ON ContentWordItem(item_id); > // index to perform fast deletes by item_id > > i have a large amount of data to insert into this join table on a slow > embedded device. i need to avoid locking this join table for more > than > a second or two at a time so that i can make queries on this table. > > so here's the question: how do i insert small chunks of data into > this > table w/o taking a hit each time i commit? > > what i'm doing is: > > * read a chunk of data from flat data file into vector of id > pairs > > * begin transaction > > * loop thru vector of id pairs binding and inserting > > * commit transaction > > * repeat until data is exhausted > > i'm seeing that the reading, binding, and inserting is very fast (300 > ms) but the commit is taking upwards of 3 seconds. when i increase my > chunk size by a factor of 10 the insert doesn't appear to take 10x > longer but the commit still takes upwards of 3 seconds. the point is > that the commit hit appears to be much greater than the insert hit but > doesn't appear to scale directly. > > it appears that the commit is updating the indexes and taking a long > time. is this a correct evaluation? > > it also appears that the commit takes longer as the size of the table > grows (i.e. the index is getting bigger). is this expected? > > what i'm worried about is that by reducing the chunk size (to avoid > locking the db for a long time) i add a significant amount of time to > the insert process because the commits are costing several seconds. > however, locking the db for a long time is not desirable. > > i'm also concerned about the commit time increasing over time as the > amount of data in the table increases. > > is there a better approach? > > thanks > tom > > ______________________________________________________________________ > This email has been scanned by the MessageLabs Email Security System. > For more information please visit http://www.messagelabs.com/email > ______________________________________________________________________ > _______________________________________________ > 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 > > ______________________________________________________________________ > This email has been scanned by the MessageLabs Email Security System. > For more information please visit http://www.messagelabs.com/email > ______________________________________________________________________ > > ______________________________________________________________________ > This email has been scanned by the MessageLabs Email Security System. > For more information please visit http://www.messagelabs.com/email > ______________________________________________________________________ > _______________________________________________ > 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 > > ______________________________________________________________________ > This email has been scanned by the MessageLabs Email Security System. > For more information please visit http://www.messagelabs.com/email > ______________________________________________________________________ > > ______________________________________________________________________ > This email has been scanned by the MessageLabs Email Security System. > For more information please visit http://www.messagelabs.com/email > ______________________________________________________________________ > _______________________________________________ > 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 > > ______________________________________________________________________ > This email has been scanned by the MessageLabs Email Security System. > For more information please visit http://www.messagelabs.com/email > ______________________________________________________________________ > > ______________________________________________________________________ > This email has been scanned by the MessageLabs Email Security System. > For more information please visit http://www.messagelabs.com/email > ______________________________________________________________________ > _______________________________________________ > 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