Android beginTransaction()、endTransaction()和setTransactionSuccessful()。他们到底做什么?
我必须在插入、查询、更新和删除数据库中的项目时提供同步。据我所知,Android beginTransaction()、endTransaction()和setTransactionSuccessful()。他们到底做什么?,android,sqlite,transactions,Android,Sqlite,Transactions,我必须在插入、查询、更新和删除数据库中的项目时提供同步。据我所知,beginTransaction()和beginTransactionNoneExclusive()是我需要的方法 此外,还很好地描述了独占、立即和延迟 事务可以是延迟的、即时的或独占的。递延手段 在第一次访问数据库之前,不会获取数据库上的锁 访问 如果事务是即时的,则在上获取保留锁 一旦执行BEGIN命令,所有数据库都将立即恢复,而不带 正在等待使用数据库。在一段时间后立即开始,没有其他 数据库连接将能够写入数据库或执行 立即开
beginTransaction()
和beginTransactionNoneExclusive()
是我需要的方法
此外,还很好地描述了独占
、立即
和延迟
事务可以是延迟的、即时的或独占的。递延手段
在第一次访问数据库之前,不会获取数据库上的锁
访问
如果事务是即时的,则在上获取保留锁
一旦执行BEGIN命令,所有数据库都将立即恢复,而不带
正在等待使用数据库。在一段时间后立即开始,没有其他
数据库连接将能够写入数据库或执行
立即开始或独占开始。其他进程可以继续进行
但是,从数据库中读取
独占事务导致在所有服务器上获取独占锁
数据库。在开始独占后,没有其他数据库连接
除read_外,未提交的连接将能够读取
数据库和任何其他连接都无法正常运行
写入数据库,直到事务完成
在某些线程处理数据库时,它似乎提供了一些保护,防止不必要的插入和查询。但我不确定它是否能保证同步
有我的ContentProvider
的insert
方法
@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()
的问题。我真的需要添加它们吗?不适用于Android!如果您正在进行可靠的数据操作,那么使用以下支持的方法是很重要的
BeginTransaction();
SetTransactionSuccessful();
EndTransaction();
进一步查看此,
是的,它使应用程序平滑。因为SQLite将一个游标视为一个事务,所以如果在插入大量数据之前使用开始事务(),然后使用StTurTraceOnExcRealFor(),然后EngTimeActuffon(),SQLite将将此插入事件视为一个事务,而不是成百上千的交易。
我想知道为什么Android文档没有提到这一点。。。