Ok?starting to sound safer. :-) at a minimum this problem only occurs when multi-threading is being used to access a sqlite DB file. but I think its probably even more specific then that?
When you say ?two copies of sqlite in the same address space?, this is the part I am getting confused about I guess. I guess you mean the single-file sqlite dot c file is compiled into a single executable more then once, somehow avoiding namespace conflicts. In such a case, then each of those code-instances would have what it thinks is a global to keep track of the db file lock, but in actuality they are each using their own private global. Do I understand it correctly now? On May 11, 2016, at 8:36 AM, Richard Hipp <drh at sqlite.org> wrote: > On 5/11/16, Steve Schow <steve at bstage.com> wrote: >> >> Typically concurrency happens when two different users execute their program >> that has sqlite compiled into it;?.. concurrently. > > The problem only comes up with two different copies of SQLite are > running within the same process. The same program being run twice is > fine. > > The problem is a bug in the posix APIs for file locking. I say "bug". > It is not an implementation problem. The implementation is correct on > all major unix systems. The problem is in the *design*. > > In posix, suppose you open a file "xyzzy" and take a lock on that file > using the file descriptor returned by open(). That works fine. > > But then if another thread in the same process (technically: another > thread with the same result from getpid()) does this: > > close(open("xyzzy")) > > The close() operation cancels all locks held on the "xyzzy" file, even > locks created by different threads using different file descriptors. > > This is crazy. Everybody acknowledges that it is crazy. But it is the > posix standard. > > In order to work around the problem, SQLite has to use global > variables to track every close() operation and defer those that are > against files with locks held by other file descriptors. But if you > have two copies of SQLite in the same address space, they will use > different global variables and may not know about each other, and > hence locks can get cancelled. > -- > D. Richard Hipp > drh at sqlite.org > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users