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



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

比方说方法A启动一个事务。在事务执行期间,另一方法B将尝试在同一表上(可能在同一行上)执行事务。

会发生什么?

方法B会"等待"到方法A完成事务,然后执行事务吗?还是方法B的转换会失败?

我该如何正确处理?

更准确地说:

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

这样做的目的是确保,无论首先执行哪种方法,都插入或更新了特定的行我甚至不确定,这些是否可以在SQLite事务级别上实现,或者我必须在Java中同步方法?

如果是这样的话,任何机构都能发布一个例子吗?这样的同步必须如何用Java编码?

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

http://en.wikipedia.org/wiki/Isolation_(数据库系统)

取决于"事务"的含义。

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

从你发布的小消息来看,我无法判断单独的线程是否有效。您可能需要考虑使用IntentService来处理您的交易;这样,一个事务只有在前一个事务结束后才能开始。

事务是由"beginTransaction"建立的,所以据我所知,事务是排他性的。

@Seand:有趣的是,上述维基百科的德语版与英语版有些不同。德语版本规定,隔离级别为"serializable"的应用程序必须能够处理序列化错误,并重新运行相应的事务。因此,我预计会有一个"SQLiteSerializationException"。但我在API中看不到这样的异常。那么,Android版的SQLite API会自动处理这个问题吗?