beginTransaction(),endTransaction()和setTransactionSuccessful()。他们究竟做了什么?

时间:2013-05-15 11:36:48

标签: android sqlite transactions

在插入,查询,更新和删除数据库中的项目时,我必须提供同步。据我所知,beginTransaction()beginTransactionNonExclusive()是我需要的方法。

此外,SQLite documentation相当好地描述了EXCLUSIVEIMMEDIATEDEFERRED

  

交易可以是延期,即时或独家。延期手段   在数据库第一次之前,不会在数据库上获取锁   访问。

     

如果事务是立即的,则获取RESERVED锁   一旦执行BEGIN命令,所有数据库都没有   等待使用数据库。在BEGIN IMMEDIATE之后,没有其他   数据库连接将能够写入数据库或做一个   开始立即或开始独家。其他流程可以继续   但是,从数据库中读取。

     

独占事务导致在所有上获取EXCLUSIVE锁   数据库。在BEGIN EXCLUSIVE之后,没有其他数据库连接   除了read_uncommitted连接将能够读取   没有异常的数据库也没有其他连接就可以了   编写数据库直到事务完成。

当某些线程正在使用数据库时,它似乎提供了一些保护,以防止不必要的插入和查询。但我不确定它是否能保证同步。

我的insertContentProvider方法。

@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()我没有遇到任何问题。我真的需要添加它们吗?

2 个答案:

答案 0 :(得分:12)

关闭Android课程!如果您正在为可靠的数据操作工作,那么使用以下支持的方法非常重要。

BeginTransaction();
SetTransactionSuccessful();
EndTransaction(); 

如需进一步了解... In android it is highly important to use transactions when working with databases.

答案 1 :(得分:1)

是的,它使应用程序流畅。因为SQLite将一个游标视为一个事务,所以如果我们在插入大量数据之前使用begin transaction(),那么使用setTransactionSuccessful()第二个,然后在endite中使用endTransaction(),SQLite将此插入事件视为一个事务,而不是数百个事务。