ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看直播体育app软件下载 >> Android开发 >> SQLite 再谈SQLite的锁

SQLite 再谈SQLite的锁(2/4)

来源:网络整理     时间:2016-04-11     关键词:sqlite

本篇文章主要介绍了"SQLite 再谈SQLite的锁",主要涉及到sqlite方面的内容,对于Android开发感兴趣的同学可以参考一下: 写在前面:SQLite封锁机制的实现需要底层文件系统的支持,不管是Linux,还是Windows,都提供了文件锁的机制,而这为SQLite提供了强大的支持。本节...

fd = open("somefile.lck", O_WRONLY | O_CREAT | O_EXCL, 0644);
if (fd < 0 && errno == EEXIST) {
    printf(
"the file is already locked");
    
return 1;
else if (fd < 0) {
    perror(
"unexpected error checking lock");
    
return 1;
}
/* we could write our pid to the file */
close(fd);

sqlite3,sqlite下载,sqlite 工具,android sqlite,sqlite expert,sqlitejrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播,sqlite数据库,sqlite语法,sqlite 可视化工具

O_EXCL标志保证open()创建锁文件的过程是原子性的。
注意以下几点:
1、任何时刻只有一个进程可以拥有锁。
2、O_EXCL标志只对本志文件系统是可靠的,对于网络文件系统并不能很好的支持。
3、锁仅仅只是建议性的。
4、如果一个持有锁的进程不正常结束,锁文件仍然存在。如果加锁进程的pid存储在锁文件中,其它进程可以检查锁进程是否存在,当它结束时就可以删除锁。但是,在检查的时候,如果pid被其它进程使用了,此时就无能为力了。
(2)记录锁(Record Locking)
为了克服锁文件的缺点,System V和BSD4.3引入了记录锁,相应的系统调用为lockf()和flock()。而POSIX对于记录锁提供了另外一种机制,其系统调用为fcntl()。Linux提供三种接口,在这里仅讨论POSIX的接口。
记录锁和锁文件有两个很重要的区别:首先,记录锁可以对文件的任何一部分加锁——这对于DBMS这样的应用程序,有极大的帮助,SQLite当然没有放过这样的好处。其次,记录锁的另一个优点就是它由内核持有,而不是文件系统持有。当进程结束时,所有的锁也随之释放。
和锁文件一样,POSIX锁也是建议性的。记录锁有两种锁:读锁(read locks)和写锁(write locks)。读锁也就是共享锁(shared lock),写锁也就是排它锁(exclusive lock)。对于一个记录,只能有一个进程持有写锁,读锁不能存在。
对于一个进程本身而言,多个锁绝不会冲突。如果一个进程对文件的200-250字节持有读锁,然后对200-225字节数据加写锁,是会成功的。此时,200-225为写锁,而226-250字节数据为读锁,该规则主要是防止进程本身发生死锁(尽管多进程之间仍然可能发生死锁)。

POSIX锁通过fcntl()系统来实现,如下:

#include

int fcntl(int fd, int command, long arg);

相关图片

相关文章