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

Mak*_*iev 15 sqlite android transactions

从数据库插入,查询,更新和删除项目时,我必须提供同步.据我所知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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有任何问题,没有beginTransaction(),endTransaction()setTransactionSuccessful()前.我真的需要添加它们吗?

小智 12

当然还有Android!如果您正在为可靠的数据操作工作,那么使用以下支持的方法很重要.

BeginTransaction();
SetTransactionSuccessful();
EndTransaction(); 
Run Code Online (Sandbox Code Playgroud)

进一步看到这个... 在android中,在使用数据库时使用事务非常重要.