啦啦啦~~~
分类: 数据库开发技术
2010-07-14 13:05:05
这种文件锁有两个问题:
1. 不同的Unix/Linux平台,线程间有可能override前一个锁;
2. 当进程关闭任一一个指向该文件的文件句柄时,所有的文件锁就无效了;
为了处理第1个问题,sqlite会检测运行的平台,如果该平台线程间会override前一个锁,那么sqlite会使用内部逻辑来禁止这种情况。
对于第二个问题,当关闭数据库时,sqlite会检测是否该进程还有其他线程在锁住这个文件,如果有,那么并不关闭这个文件句柄,直到所有的锁都释放完毕。
因为这样的处理,在多线程的环境下,就有可能造成该数据库文件始终被一个线程锁住,而无法释放文件锁。
但是当文件句柄到达1024,也就是系统的最大限制时,其他线程将无法打开这个数据库文件,只剩下一个线程可以打开数据库。
那么即使线程间竞争再激烈,那个唯一打开数据库的线程也会有机会释放掉所有的文件句柄。
除非有某个线程block住了
所以,当你发现你因为文件句柄满了而无法打开数据库。就可以从两方面查看这个问题。
1.检查是否有文件句柄在某些情况下确实没有关闭,如出错处理等等;
2..检查是否有死锁,或者死循环导致线程阻塞,使该线程始终拥有一把数据库锁;