我应该总是在android sqlite中使用交易吗?

时间:2015-04-18 20:01:29

标签: android sqlite 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;
}

我认为sqlite会自动启动一个事务。我的同事说我必须经常开始交易。

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

1 个答案:

答案 0 :(得分:5)

  

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

     

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

SQLite Query Language

所以是的,交易会自动启动。但是,如果您在不手动启动事务的情况下执行多个查询,则会启动并完成多个事务,这会对性能产生负面影响 此外,自动回滚机制仅在失败时回滚单个查询。