我应该总是在android sqlite中使用事务吗?

die*_*ter 5 sqlite android transactions

这是一个简单的示例:

public boolean containsId(Long userid) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * from " + getTableName() + " where id = " + userid, null);
    boolean rows = cursor.getCount() > 0;
    db.close();
    return rows;
}
Run Code Online (Sandbox Code Playgroud)

我以为sqlite会自动开始交易。我的同事说我必须总是开始交易。

那么正确的模式是什么?如果我从数据库中读取数据,应该开始交易吗?我确定此表此时不会再有其他线程写入。

nha*_*man 5

除了在事务中,不能对数据库进行任何更改。如果尚未生效,则任何更改数据库的命令(基本上是SELECT以外的任何SQL命令)都会自动启动事务。最后一个查询完成后,将提交自动启动的事务。

可以使用BEGIN命令手动启动事务。这样的事务通常会持续到下一个COMMIT或ROLLBACK命令为止。但是,如果数据库关闭或发生错误并且指定了ROLLBACK冲突解决算法,则事务也将回滚。

SQLite查询语言

因此,是的,事务会自动开始。但是,如果执行多个查询而不手动启动事务,则会启动和完成多个事务,这会对性能产生负面影响。
此外,自动回滚机制仅在失败时回滚单个查询。