Sqlite事务锁状态以及死锁问题

2019-10-20  本文已影响0人  突击手平头哥

Sqlite事务锁

Sqlite事务中锁的状态

一个事务

BEGIN(UNLOCKED)
SELECT...(SHARED)
INSERT...(RESERVED)
COMMIT(PENDING)

  一个事务大致会经过如上流程进行一个修改数据库操作, 但是我们可以看到: 在COMMIT时需要等待其他线程释放SHARED锁, 那么假设另外一个事务进行了读取操作下一步等待进行插入操作, 那么就进入了死锁

//线程1               //线程2
BEGIN(UNLOCKED)     
                    BEGIN(UNLOCKED)
SELECT...(SHARED)
                    SELECT...(SHARED)
INSERT...(RESERVED) 
COMMIT(PENDING)...
                    INSERT...

  COMMITINSERT各自等待对方的锁释放, 造成了死锁

BEGIN起始状态

  RESERVED同时不允许多个获取, 所以不允许同时开启两个IMMEDIATE方式的事务; EXCLUSIVE方式来说, 即使使用BEGIN开启了另外一个事务, 也无法进行任何查看更改操作了

如果把SQlite数据库用于特别复杂或要求很高的场景, 其多线程的安全使用还是很需要考量的!

总结

上一篇下一篇

猜你喜欢

热点阅读