如果在android中的SQLite事务期间,第二个线程在同一个表上尝试事务会发生什么?

时间:2012-03-30 01:29:43

标签: java android sqlite transactions

我真的不了解Android中SQLite事务的正确使用模式。

让我们说方法A开始一个交易。在执行事务期间,另一个方法B将尝试在同一个表上执行事务(可能在同一行上)。

会发生什么?

方法B“等待”,直到方法A完成事务,然后执行事务? 或者方法B的转换会失败吗?

我该如何妥善处理?

更确切地说:

  • 方法A应查询(在事务内)某个行是否已经存在,如果存在,则返回该行,如果该行尚不存在,则应插入该行,并返回新插入的行。
  • 方法B应查询(在事务内)是否已存在某一行,更新该行,如果该行尚不存在,则方法B应插入该行。

这个想法是确保,无论首先执行哪种方法,都要插入或更新该特定行 我甚至不确定,如果这些可以在SQLite事务的级别上实现,还是我必须在Java中同步方法?

如果是这样,任何正文都可以发布一个例子,如何用Java编写这样的同步?

3 个答案:

答案 0 :(得分:1)

如果'A'修改了事务中的表,则应该阻止'B'(在SQLite本身内),直到'A'被提交。除了处理持久数据之外,它与java同步非常相似。一些细节取决于隔离级别

http://en.wikipedia.org/wiki/Isolation_(database_systems

答案 1 :(得分:0)

取决于“交易”的含义。

如果您指的是由SQLiteDatabase.beginTransaction或beginTransactionNonExclusive建立的事务,则适用这些方法的规则。我会说你应该为方法A执行beginTransaction,运行它直到完成,然后完成事务。如果方法B尝试执行事务,则应该遇到异常。事务允许您执行多个操作,如果它们不起作用,则将它们全部退出。

我不知道你发布的那个小小的单独的线程是否可行。您可能需要考虑使用IntentService来处理您的事务;这样,一个事务在前一个事务结束之前就无法启动。

答案 2 :(得分:0)

交易是通过“beginTransaction”建立的,所以根据我的理解,交易是独家的。

@sseand:有趣的是,所提到的wikipedia aricles的德语版本与英文版本略有不同。德语版本声明,隔离级别为“serializable”的应用程序必须能够处理序列化错误,并重新运行相应的事务。所以我希望,有一个“SQLiteSerializationException”。但我在API中看不到这样的例外。那么,SQLite API for Android会自动处理吗?