【问题标题】:sqlite transaction during lengthy operation长时间操作期间的 sqlite 事务
【发布时间】:2014-06-02 17:36:10
【问题描述】:

我正在构建一个应用来下订单。当我在订单中添加商品时,我会从库存中删除商品数量。但如果出现问题或用户取消订单,我需要恢复所有库存操作。 因此,当我开始一个新订单时,我调用 beginTransaction()。然后我继续添加项目。完成后,我使用 setTransactionSuccessful() 和 endTransaction() 提交事务。

在启动事务的线程中,我可以“看到”我更改的数据。另一方面,此数据未提交,因此,如果我从另一个线程运行查询,则不存在。

如何在不提交事务的情况下从另一个线程获取这些更改的数据?

我正在考虑使用线程内的查询池进行某种查询序列化。

我的方法是对的吗?

【问题讨论】:

  • 不要尝试使用sqlite数据库文件同步,只使用一些共享对象
  • 这是一种方式。另一种方法是拥有一个中间系统,一个表格或一个内存对象来保存您的订单行,您只会在最后放入最终表格。第三种方法是相反:将数据保存在带有日志对象或表的最终表中,以便能够执行回滚。
  • 感谢您的回答。我用一种“DatabaseManager”解决了我的问题,它可以将查询排队并将它们定向到消费者线程。一旦只有启动事务的线程可以“接触”新数据,这种方法就非常有效。现在,每次我在事务中,每个线程都可以访问新的新鲜数据。如果事务被取消,线程会回到事务之前的旧数据。

标签: android multithreading sqlite transactions


【解决方案1】:

事务的上下文是数据库连接(Android 中为SQLiteDatabase)。

要允许其他线程访问事务中更改的数据,您必须共享SQLiteDatabase 对象。 (使用普通的synchronized 机制来管理对该对象的并发访问。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2011-03-03
    相关资源
    最近更新 更多