网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.如何将SQLSERVER数据库备份到网络.
.如何修改Syabse服务器端的默认字.
.如何对非系统表空间的数据文件进.
.SQL Server日志文件总结及日志满.
.几种解决互联网应用程序开发的好.
.SQL语句优化技术分析.
.从SQL备份文件中导入现存数据库中.
.sql 语句对时间操作的总结.
.如何让SELECT 查询结果额外增加自.
.设计数据库之经验谈.
.怎样用SQL 2000 生成XML.
.异构数据库之间的导入导出.
.使用SQLSERVER的扩展存储过程实现.
.巧用数据库引擎优化Tuning Advis.
.教你在SQL Server数据库中设计表.
.如何删除数据库中的冗余数据(翻.
.SELECT语句中“加锁选项”功能说.
.一种简单的表中删除重复行的方法 .
.sql server 2000中的触发器使用.
.xp sp2 + sql server 2000 devel.

SQLite数据库用来处理锁定情况的两个函数

发表日期:2008-6-19


SQLite数据库在使用的过程中经常发生的数据库异常便是数据库被锁定了(SQLITE_BUSY或者SQLITE_LOCKED)。SQLite对于并发的处理机制是允许同一个进程的多个线程同时读取一个数据库,但是任何时刻只允许一个线程/进程写入数据库。所以必须要对数据库的读写来进行控制。

SQLite数据库本身用来处理锁定情况的两个函数:

int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);

int sqlite3_busy_timeout(sqlite3*, int ms);

使用这两个函数可以设定当发生数据库锁定的时候,调用什么函数来处理,以及设定锁定时的等待时间。

当然通常情况下我们还可以用另外一种方法来解决这类问题,那便是设置互斥量。一般情况下我们可以使用互斥量,临界区等来实现。在这里我使用了互斥量,主要是因为我需要在多个不同的进程中并发的访问同一个数据库。用于锁定和解锁的函数如下:

void Lock()

{

if((hCounter = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"kangxiaofang")) == NULL)

{

//如果没有其他进程创建这个互斥量,则重新创建

hCounter = CreateMutex(NULL,FALSE,"kangxiaofang");

WaitForSingleObject(hCounter,INFINITE);

}

else

{

WaitForSingleObject(hCounter,INFINITE);

}

}

void UnLock()

{

//释放使用权

ReleaseMutex(hCounter);

//关闭句柄

CloseHandle(hCounter);

}

当然我们也可以把等待时间设定为60秒,以免出现死等的现象。具体使用时可以按如下调用:

//锁定数据库

Lock();

rc = sqlite3_exec(db, "BEGIN;", 0, 0, &zErrMsg);

rc = sqlite3_exec(db, exec, 0, 0, &zErrMsg);

rc = sqlite3_exec(db, "COMMIT;", 0, 0, &zErrMsg);

//数据库解锁

UnLock();

总结:

经过测试后,你会发现这种方法所需的消耗要小于循环打开数据库的操作。

上一篇:简明扼要的讲解数据仓库所拥有的四个特点 人气:785
下一篇:借助两个开发包在PL/SQL中实现多进程通信 人气:890
浏览全部SQLite的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐