我应该在Android SQLite中始终使用事务吗?

6
这里有一个简单的例子:
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个回答

6
除了在事务中,不能对数据库进行任何更改。任何更改数据库的命令(基本上是除SELECT之外的任何SQL命令)如果没有事务正在生效,则会自动启动一个事务。自动启动的事务将在最后一个查询完成时提交。
可以使用BEGIN命令手动启动事务。这种事务通常持续到下一个COMMIT或ROLLBACK命令。但是,如果关闭数据库或指定了ROLLBACK冲突解决算法并发生错误,则事务也会回滚。
因此,是的,事务会自动启动。但是,如果您在不手动启动事务的情况下执行多个查询,则会启动和完成多个事务,这会对性能产生负面影响。此外,自动回滚机制只在单个查询失败时回滚该查询。
参考:SQLite Query Language

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接