在提交事务之前,如果 #2 行中间某处断电,那么如何可以肯定地说以下操作列表将永远不会反映在 DB 中?
#1 begin transaction
#2 delete record in table A that cascade deletes another record in table B
#3 update another record in table C
#4 commit transaction
在提交事务之前,如果 #2 行中间某处断电,那么如何可以肯定地说以下操作列表将永远不会反映在 DB 中?
#1 begin transaction
#2 delete record in table A that cascade deletes another record in table B
#3 update another record in table C
#4 commit transaction
从 SQLite FAQ 我知道:
多个进程可以同时打开同一个数据库。多个进程可以
SELECT
同时进行。但是,任何时候只有一个进程可以对数据库进行更改。
所以,据我了解,我可以:1)从多个线程(SELECT
)读取数据库 2)从多个线程( )读取数据库SELECT
并从单线程(CREATE
,,INSERT
)写入DELETE
但是,我读到了Write-Ahead Logging,它提供了更多的并发性,因为reader 不会阻塞 writer,而 writer 不会阻塞 reader。读和写可以同时进行。
最后,当我找到它时,我完全糊涂了,当指定时:
以下是获得 SQLITE_LOCKED 错误的其他原因:
- 在语句仍处于未决状态时尝试访问表
CREATE
或DROP
索引。SELECT
- 尝试在 a 在同一张表上处于活动状态时写入
SELECT
表。- 如果未设置 sqlite,则尝试
SELECT
在多线程应用程序中同时在同一张表上执行两个操作。- fcntl(3,F_SETLK 对 DB 文件的调用失败。这可能是由 NFS 锁定问题引起的,例如。解决此问题的一种方法是将 DB 移走,然后将其复制回来,使其具有新的 Inode 值
所以,我想为自己澄清一下,有必要避免锁定吗?我可以从两个不同的线程同时读写吗?谢谢。