面试题答案
一键面试可能面临的问题
- 性能瓶颈:SQLite是轻量级数据库,采用文件级锁。高并发场景下,大量事务等待锁,易造成线程长时间阻塞,导致整体性能急剧下降。
- 死锁风险:多个事务相互等待对方释放锁,可能形成死循环,造成死锁,使相关事务无法继续执行。
- 资源浪费:等待锁的线程占用系统资源,若长时间等待,会导致资源浪费,甚至引发系统资源耗尽问题。
优化等待锁策略的思路
- 减少锁竞争:优化事务设计,减少同时访问相同数据的频率。
- 合理安排锁顺序:确保所有事务以相同顺序获取锁,避免死锁。
- 设置合理等待时间:避免无限期等待,及时释放资源。
具体措施
- 事务分割:
- 将大事务拆分成多个小事务,减少单个事务持有锁的时间。例如,原本一个涉及多个表更新的大事务,拆分成针对每个表的小事务依次执行。
- 锁粒度调整:
- 虽然SQLite是文件级锁,但可通过业务逻辑调整,尽量让不同事务操作不同部分的数据。如按业务模块划分数据,不同事务只操作各自模块数据。
- 死锁检测与恢复:
- 定期检查事务等待关系,发现死锁时,选择回滚代价最小的事务,释放其持有的锁,让其他事务继续执行。可通过记录事务等待图实现。
- 设置等待超时:
- 为每个等待锁的操作设置合理的超时时间。例如使用
PRAGMA busy_timeout
设置等待锁的最长时间,超时后事务自动失败并回滚,避免线程无限期等待。
- 为每个等待锁的操作设置合理的超时时间。例如使用