tun*_*dun 5 sqlite android transactions ormlite
我在Android项目中使用ORMLite.我知道Sqlite负责文件级锁定.很多线程都可以读,有人可以写.锁可防止多次写入.有人可以解释一下,如果一个线程正在更新某个记录而另一个线程正试图读取该记录,会发生什么?线程(试图读取)会得到过时的数据吗?或者它会被锁定,直到第一个线程完成其写操作?据我所知,有4个事务隔离级别:Serializable,Repeatable read,Read committed,Read uncommitted.有没有办法在SQLite或ORMLite中更改它?
Dan*_*vak 10
SQLite有5个不同的锁定级别 - http://www.sqlite.org/lockingv3.html:unlocked,shared,reserved,pending,exclusive.这个问题的重要锁定是共享锁:
"共享 - 数据库可以读取但不能写入.任意数量的进程可以同时保存SHARED锁定,因此可以有许多同时读取.但是没有其他线程或进程可以写入数据库文件更多的SHARED锁是活跃的."
锁是表级的(因此在DB中使用单行执行某些操作时 - 整个表都被锁定).
因此,在选择数据时,不允许其他进程更改数据.读取数据的锁定步骤为:UNLOCKED→PENDING→SHARED→UNLOCKED(您可以在事务中运行选择).因此,您选择某些内容并且某人将更改数据的情况不会发生.
您的问题是如果您要更新数据库并在同一个表上执行选择会发生什么.在自动提交模式下,写入/更新的锁定机制为:UNLOCKED→PENDING→SHARED→RESERVED→PENDING→EXCLUSIVE→UNLOCKED.在Exclusive锁中,没有新的读者(连接)可以连接到数据库.一次只能存在一个EXCLUSIVE锁.然后SQLite将等待,直到读取连接的所有其他PENDING锁被释放,并将阻止任何新的.此时,它将开始写入数据.
所以,我的答案是 - 只要更新过程没有完成,你的其他过程当然会获得旧数据.确保在事务中运行更新,以便不会发生数据不一致.SQLite符合ACID标准,因此不应发生部分更新和包含数据的情况.
一本关于此的好书是"SQLite的权威指南",特别是"交易"一章.
| 归档时间: |
|
| 查看次数: |
7742 次 |
| 最近记录: |