为什么sqlite会返回database locked而别的数据库不会?
一、为什么sqlite会返回database locked而别的数据库不会
sqlite可以支持多个进程同时读取,但不支持同时写入,主要原因是因为它默认采用了串行化的事务隔离,他在写数据到文件的时候加了一把文件粒度的排他锁,这个时候是不能并发读取的和写入的,这时如果有请求就会进入等待。
等待超时后会抛出database is locked错误。这个和嵌入式没什么关系,嵌入式数据库同样可以通过文件锁、共享内存等方式实现多进程访问,通过快照隔离实现并发读写。
MySQL里面的myisam引擎其实也是不支持并发读写的,现在用的比较少,innodb存储引擎则是通过MVCC支持并发读写的。
sqlite遇到database is locked问题的完美解决
1、使用进程或线程间的同步机制以避免同时操作;如用信号量,互斥锁等(pthread_mutex_lock,
pthread_mutex_unlock),如果你的项目工程较大要求较高的话建议用此方法自行封装函数处理同步
2、使用sqlite提供的两个busy handler函数,但对于一个连接来说,只能有一个busy handle,两个函数会相互影响,设
置一个的同时会清除另一个,应根据需要来选择。
int sqlite3_busy_handler(sqlite3 *, int (*)(void *, int), void *)
不注册此函数时默认回调函数为NULL,清除busy handle,申请不到锁直接返回;
函数可以定义一个回调函数,当出现数据库忙时sqlite会调用该函数进行延时并返回非0会重试本次操作,回调函数的第二个
参数会被传递为此次因BUSY忙事件而调用该函数的次数,因此你完全可以自行控制多少次后(也就是延时多少后)才真正返回
BUSY;
回调函数返回非0,数据库会重试当前操作,返回0则当前操作返回SQLITE_BUSY;
int sqlite3_busy_timeout(sqlite3*, int ms);
不注册此函数时默认超时等待为0,当ms<=0时,清除busy handle,申请不到锁直接返回;
定义一个毫秒数,当未到达该毫秒数时,sqlite会sleep并重试当前操作,
如果超过ms毫秒,仍然申请不到需要的锁,当前操作返回SQLITE_BUSY;
很多人用这个函数没有成功,其实只要你仔细查看sqlite的源码就会发现,
这个函数实际上注册了一个默认的sqlite3_busy_handler(sqliteDefaultBusyCallback),而这个回调函数在你的编译
环境下可能使得第二个ms参数必需要大于1000且是他的整数倍才有意义,由于此默认callback函数延时较大,建议自己写回
调函数然后用slite3_busy_handler注册,这样就可以自己用自己的延时函数或方法进行处理了。
延伸阅读:
二、SQL是什么
Structured Query Language
‘SQL’是结构化查询语言,是一种用来操作 RDBMS 的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的关系型的数据库
SQL语句主要分为:DQL:数据查询语言,用于对数据进行查询,如select**
DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete**
TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
DCL:数据控制语言,进行授权与权限回收,如grant、revoke
DDL:数据定义语言,进行数据库、表的管理等,如create、drop
CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor对于web程序员来讲,重点是数据的crud(增删改查),必须熟练编写DQL、DML,能够编写DDL完成数据库、表的操作,其它语言如TPL、DCL、CCL了解即可SQL 是一门特殊的语言,专门用来操作关系数据库不区分大小写

猜你喜欢LIKE
相关推荐HOT
更多>>
MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
一、MySQL多表关联查询效率高的原因一般情况下,MySQL多表关联查询比多次单表查询效率高,原因为:1、可以使用一个SQL查询语句同时查询多个表多...详情>>
2023-10-10 19:00:31
抖音小店怎么分销商品
如今,随着社交电商的发展,抖音小店的粉丝和销售成交量也在逐渐增加。然而,对于许多新手来说,如何完善自己的分销商品策略仍然是个难题。在本...详情>>
2023-10-10 09:42:22
抖音小店在线支付优惠券怎么用
抖音小店已经成为了越来越多人的购物选择,其中在线支付优惠券的使用更能为消费者带来实实在在的福利,但是很多人并不知道如何使用这些优惠券...详情>>
2023-10-10 08:25:06
抖音小店怎么咨询客服电话号码
在抖音购物的过程中,如果遇到问题需要咨询或反馈,如何联系到客服呢?这篇文章将会为您介绍抖音小店怎么咨询客服电话号码。使用抖音咨询客服电...详情>>
2023-10-10 06:13:40热门推荐
分布式数据库与集中式数据库的主要区别是什么?
沸数据仓库中,什么是business key?
热为什么数据库不能通过不断的添加服务器节点来实现扩展?
热数据库和数据库管理系统、数据库系统是什么关系?
新jdbc的resultset底层实现原理是怎样的?
为什么sqlite会返回database locked而别的数据库不会?
MySQL中的自增主键的步长有关的变量AUTO_INCREMENT_INCREMENT与AUTO_INCREMENT_OFFSET为什么是全局变量,而不是表维度的?
mysql误删表里的数据没有备份的情况下怎么恢复啊?
类似博客这样的图文混排内容在数据库中是以什么形式保存的呢?
MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
Web测试需要兼顾的测试要点有哪些?
用access做一个数据库,用户登录界面,不同用户权限不同,应该怎么设置?
美国seer数据库怎么用?
开抖音小店的营业执照需要什么资料
技术干货






