在Android中,是否可以使用事务来读取稍后将在同一事务中删除的值?
就像这样:
SQLiteDatabase db = helper.getReadableDatabase();
db.beginTransaction();
String whereClause = "COL1 = ? AND COL2 = ?";
// make a SELECT Query to read data
Cursor c = db.rawQuery("SELECT * FROM Foo "+whereClause, whereValues);
...
// read Cursor data etc.
...
db = helper.getWriteableDatabase();
// Delete data
db.delete("Foo", whereClause, whereValues);
db.setTransactionSuccessful();
db.endTransaction();
我想获取将要删除的数据,并通知UI组件该数据已被删除。
我使用多个线程,并希望确保在查询和删除之间没有其他表中的数据发生更改。
我可以在Java中使用synchronized等方式或锁定整个数据库(这只是作为最后一种选择),以实现此目的。
那么,对于这种情况,是否可以并且安全地使用事务?如果可以,如何在读取和写入事务中使用getWriteableDatabase()和getReadableDatabase()?
使用事务是否保证只删除先前查询过的数据?而不可能在SELECT查询和DELETE之间插入另一条数据记录(例如由其他线程插入)...我希望避免删除未被先前SELECT查询查询的数据记录,因为它是在SELECT查询之后和DELETE语句之前插入的。
示例:我有一个名为Foo的表:
ID | COL1 | COL2
---|------|-----
1 | 1 | 1
---|------|-----
2 | 0 | 1
---|------|-----
3 | 1 | 1
假设我使用事务方式: 我将执行
SELECT * FROM Foo WHERE COL1 = 1 AND COL2 = 1
。结果将返回 ID=1 和 ID=3 的行。假设在执行 DELETE 语句之前,另一个线程插入了一行数据,使得表的内容变成下面这样:
ID | COL1 | COL2
---|------|-----
1 | 1 | 1
---|------|-----
2 | 0 | 1
---|------|-----
3 | 1 | 1
---|------|-----
4 | 1 | 1
接下来将执行DELETE语句:
DELETE FROM Foo WHERE COL1 = 1 AND COL2 = 1
所以ID为1、ID为3和ID为4的行将被删除。但前面SELECT的结果是ID为1和ID为3的行。 所以我没有注意到失去了ID为4的行。
这正是我试图避免的。
我猜那将是使用锁的用例,但我不喜欢锁……