在从数据库中插入、查询、更新和删除项目时,我必须提供同步。据我了解beginTransaction()
,beginTransactionNonExclusive()
是我需要的方法。
除了SQLite 文档对EXCLUSIVE
,IMMEDIATE
和 的描述DEFERRED
非常好。
事务可以是延迟的、立即的或排他的。延迟意味着在第一次访问数据库之前不会在数据库上获取锁。
如果事务是即时的,那么只要执行 BEGIN 命令,就会在所有数据库上获取 RESERVED 锁,而无需等待数据库被使用。在 BEGIN IMMEDIATE 之后,没有其他数据库连接能够写入数据库或执行 BEGIN IMMEDIATE 或 BEGIN EXCLUSIVE。但是,其他进程可以继续从数据库中读取。
独占事务会导致在所有数据库上获取 EXCLUSIVE 锁。在 BEGIN EXCLUSIVE 之后,除了 read_uncommitted 连接之外,没有其他数据库连接能够读取数据库,并且没有任何其他连接毫无例外地能够写入数据库,直到事务完成。
当某些线程正在使用数据库时,它似乎提供了一些保护,防止不必要的插入和查询。但我不确定它是否保证同步。
有insert
我的方法ContentProvider
。
@Override
public Uri insert(Uri baseUri, ContentValues values) {
try {
mDatabase = mHelper.getWritableDatabase();
mDatabase.beginTransaction(); // EXCLUSIVE
switch (sUriMatcher.match(baseUri)) {
case UriCodes.COUNTRIES:
case UriCodes.CONTINENTS:
case UriCodes.ORGS:
String table = baseUri.getLastPathSegment();
long rowId = mDatabase.insert(table, null, values);
Uri uri = Uri.withAppendedPath(baseUri, Long.toString(rowId));
mDatabase.setTransactionSuccessful();
return uri;
default:
mDatabase.endTransaction();
throw new IllegalArgumentException(UNSUPPORTED_URI + SPACE + baseUri);
}
} finally {
mDatabase.endTransaction();
}
}
beginTransaction()
没有,endTransaction()
和setTransactionSuccessful()
之前我没有任何问题。我真的需要添加它们吗?