Android SQLite

拈花ヽ惹草 提交于 2020-12-24 13:44:54
 
五种加锁状态
UNLOCKED:无锁状态。
SHARED:共享状态。同一时刻可加多个共享锁,即多个读操作可同时进行。
RESERVED:保留状态。说明将来要进行写操作,但目前还在进行读操作。同一时刻只能有一个保留锁,但其它事务可获取共享锁。
PENDING:未决状态。表示想要尽快写数据库,此时其它事务不能获取共享锁,等其它所有的共享锁都释放后便可获取独占锁。
EXCLUSIVE:独占状态。写数据库必须获取独占锁。不能与其它锁共存。
 
事务日志模式
回滚模式和WAL(Write Ahead Logging)模式。
1)回滚模式
写操作直接修改数据库文件,但写之前会先写日志文件(“-journal”的缀),写成功后删除日志,失败则通过日志回滚。
Android下,整个写事务周期内,都不能读数据库。(其它平台不清楚)
2)WAL模式
写操作会先将内容写入wal文件,然后再同步到数据库,使得读写数据库可以同时进行。
但从wal同步数据到数据库文件时不能读,其它事务读数据时也会阻塞同步操作。
同一连接下,读数据需要同时读数据库文件和wal文件,相对回滚模式耗时稍长。
 
Android中使用事务:
   db.beginTransaction();
   // db.beginTransactionNonExclusive();
   // db.beginTransactionWithListener(listener);
   // db.beginTransactionWithListenerNonExclusive(listener);
   try {
     ...
     db.setTransactionSuccessful();
   } finally {
     db.endTransaction();
   }

以db.beginTransaction()开始,操作完成后调用db.setTransactionSuccessful(),中途异常不会调用此函数。最后通过db.endTransaction()提交,提交时若发现没有调用db.setTransactionSuccessful(),则认为操作异常,就会进行回滚。

默认情况下使用的时回滚模式,此时,db.beginTransaction()和db.beginTransactionNonExclusive()其实没有区别,整个事务期间,其它事务都无法进行读操作。

当使能WAL模式后,db.beginTransactionNonExclusive()仅在同步wal数据到数据库时,其它事务才不能读数据库,而其余时间则可以读数据库。

使能WAL模式:https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#enableWriteAheadLogging()

     SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory,
             SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING,
             myDatabaseErrorHandler);

或者:

     SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory,
             SQLiteDatabase.CREATE_IF_NECESSARY, myDatabaseErrorHandler);
     db.enableWriteAheadLogging();

 

 
 
 
 
 
 
 
 
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!