【发布时间】:2016-06-09 16:25:49
【问题描述】:
是否可以在 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 的行,而没有注意到。
而这正是我想要避免的。
我猜这将是一个 LOCK 的用例,但我不喜欢 LOCKS ...
【问题讨论】:
标签: android sqlite transactions