I think the following observation, which I made in the meantime, may be very interesting. Which also gives a hint to a problem with SQLite in combination with the encryption of System.Data.SQLite. I tried the same test with an unencrypted database, and surprisingly the 3 threads do their work without any exception. I executed several test runs with the 3 threads and it wasn't reproducable anymore. Activating the encryption again it's reproducable and exceptions occur due to an old stamp that is being retrieved.
Answers to your questions: - No connections are shared at all between threads. So every thread creates 2 private connections. - Updating always occurs in the second connection. - The after-update checks will be perfomed in the same transaction as the update itself. - No thread ever deletes a row. Regards Fabrizio > -----Ursprüngliche Nachricht----- > Von: sqlite-users-boun...@sqlite.org [mailto:sqlite-users- > boun...@sqlite.org] Im Auftrag von Igor Tandetnik > Gesendet: Donnerstag, 15. Dezember 2011 14:26 > An: sqlite-users@sqlite.org > Betreff: Re: [sqlite] SQLite reading old data > > Fabrizio Steiner <f...@bbtsoftware.ch> wrote: > > I'm currently facing a problem with the System.Data.SQLite ADO.NET > > Provider. I'm using stamps (simple integer column) on the rows in > > order to detect if another user has altered the same datarow during the > time the first user started the edit and when he invoked the save. Every > update increases this stamp and the update statement is constrained with > the old stamp. If the update has > > no affected rows, there are different cases which are checked: > > - If the datarow has been deleted, the user is informed about this. > > - If the datarow still exists the current stamp in the database is > > retrieved. > > - If the db stamp is greater than the reference stamp, the user will > > be informed that another user changed the data in the meantime. > > - If the db stamp is smaller or equal to the reference stamp, an exception > is thrown because the stamp can never get smaller. > > > > I tried to simulate 3 users which are updating a datarow in the same > > table, every user changes it's own row. Basically I had 3 threads > > each of one first retrieving a row in one connection. Updating the data and > storing it back into the table with another connection. Every thread made a > loop with several edits and a sleep in between. > > Do you have two connections, each shared by three threads; or six separate > connections? Do you ever perform any writing on the connection that reads > the original version of the row? Do you perform after-update checks on the > same connection as the update itself? Do you wrap the update and the > checks together in a transaction? > > How is a particular "datarow" identified? Is it possible for one thread to > delete a row, and then for another to insert it back later as new (presumably > with the version stamp starting back from zero)? > -- > Igor Tandetnik > > _______________________________________________ > 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