SQLite3多线程模式下预准备语句事务是否会被另一事务阻塞?
SQLite多连接预准备操作阻塞问题解答
核心结论
第二个连接的预准备(prepare)操作是否会被第一个事务阻塞,取决于数据库使用的日志模式以及第一个事务的锁持有状态,不存在统一的“一定阻塞/一定不阻塞”的结果。
分场景说明
场景1:使用SQLite默认的DELETE回滚日志模式
第一个事务执行写操作时,会在首次执行写语句后持有数据库的全量排他锁,此时所有其他连接的读、写访问都会被阻塞。prepare操作需要读取数据库系统表校验SQL语法、表/字段合法性,必须申请共享读锁,因此会被第一个事务的排他锁直接阻塞。场景2:数据库开启WAL(预写日志)模式
WAL模式下写操作只会独占WAL日志文件,不会阻塞其他连接对原始数据库文件的读请求。prepare操作仅需要读取静态schema信息,只会申请读锁,因此不会被第一个正在执行的写事务阻塞,可以正常完成预准备。
额外说明
如果prepare的SQL仅操作当前连接私有的临时表,不需要访问主数据库的公共schema或数据,那么不管使用哪种日志模式,该操作都不会被其他连接的事务阻塞。
内容的提问来源于stack exchange,提问作者joe2310
相关产品推荐
相关产品推荐

