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