五种加锁状态
UNLOCKED:无锁状态。
SHARED:共享状态。同一时刻可加多个共享锁,即多个读操作可同时进行。
RESERVED:保留状态。说明将来要进行写操作,但目前还在进行读操作。同一时刻只能有一个保留锁,但其它事务可获取共享锁。
PENDING:未决状态。表示想要尽快写数据库,此时其它事务不能获取共享锁,等其它所有的共享锁都释放后便可获取独占锁。
EXCLUSIVE:独占状态。写数据库必须获取独占锁。不能与其它锁共存。

事务日志模式
回滚模式和WAL(Write Ahead Logging)模式。
1)回滚模式
写操作直接修改数据库文件,但写之前会先写日志文件(“-journal”的缀),写成功后删除日志,失败则通过日志回滚。
写操作直接修改数据库文件,但写之前会先写日志文件(“-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数据到数据库时,其它事务才不能读数据库,而其余时间则可以读数据库。
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();
来源:oschina
链接:https://my.oschina.net/igiantpanda/blog/4837094