这是一个简单的例子:
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会自动启动一个事务。我的同事说我必须经常开始交易。
那么正确的模式是什么?如果我从数据库中读取数据,我应该开始交易吗?我确信此表中没有其他线程会写入。
答案 0 :(得分:5)
除了在事务中,不能对数据库进行任何更改。 任何更改数据库的命令(基本上都是任何SQL命令 除SELECT之外,如果有的话,将自动启动一个事务 尚未生效。自动启动的交易是 在最后一个查询完成时提交。
可以使用BEGIN命令手动启动事务。这样 事务通常持续到下一个COMMIT或ROLLBACK 命令。但是如果数据库是事务,事务也将ROLLBACK 关闭或者如果发生错误并且ROLLBACK冲突解决 算法已指定。
所以是的,交易会自动启动。但是,如果您在不手动启动事务的情况下执行多个查询,则会启动并完成多个事务,这会对性能产生负面影响 此外,自动回滚机制仅在失败时回滚单个查询。