2

我正在 Android 中设计一个模块,该模块进行一些处理,然后使用 ORMLite 事务写入数据库。特别是,我的背景代码将类似于:

public class BackgroundOperation implements Runnable {
        @Override
    public void run() {
        //Do some stuff

        //Write to the database in a transaction
        try {

            ORMHelper h = ORMHelper.getDefaultOrmHelper();
            final MyModel modelObj = h.myModelDao.queryForId(someId);
            TransactionManager.callInTransaction(
                h.getConnectionSource(),
                new Callable<Void>() {
                    public Void call() throws Exception {
                        modelObj.col1 = 10;
                        modelObj.col2 = "hello";
                        h.myModel2Dao.update(modelObj);
                        h.myModel2Dao.create(new MyModel2("a", "b"));
                        return null;
                    }
                }
            );
        }
        catch (Exception e) {
            return null;
        }
    }
}

然后,这个可运行文件将通过提交给 ThreadPoolExecutor 来执行。如果需要,我希望能够取消后台线程,并试图确保如果操作被取消,那么事务将简单地失败并且什么都不做。例如,如果我这样做:

Future f = myThreadPoolExecutor.submit(new BackgroundOperation());

//Some time later
f.cancel(true);

我可以确定这将是全有或全无处理 ORMLite 中的交易。也就是说,不需要清理,我的 modelObj 将同时设置 col1 和 col2 或都不设置?在 Runnable 中捕获 InterruptedException 以处理以这种方式取消任务的情况时,我是否需要做任何特别的事情,或者我可以简单地退出?

4

2 回答 2

2

如果您调用f.cancel(true),所做的只是中断Thread导致wait(),sleep()和其他一些抛出的方法InterruptedException。它不会取消正在进行的数据库事务。

如果需要,您可以在 IO 操作中间检查中断位:

h.myModel2Dao.update(modelObj);
if (Thread.currentThread().isInterrupted()) {
   throw new RuntimeException("Thread was interrupted");
}
h.myModel2Dao.create(new MyModel2("a", "b"));

有关线程中断时发生的情况的更多信息,请参见此处:

java.lang.Thread.interrupt() 有什么作用?


事务用于将多个对象作为一个单元更新或写入多个表时。请参阅有关事务的文档,其中包含更新事务的 anAccountOrderinside 的示例。

此外,如果要更新同一行中的多个字段,则不需要使用事务。更新语句被认为是一个单一的单元,数据库应该确保该行自动更新。只有当您在同一个表或不同的表中更新多个不同的行时,您才需要事务。

于 2012-05-08T01:17:39.813 回答
0

ORMLite 将在幕后利用 sqlite 事务。这很可能是双阶段提交,它只允许您将事务作为一个整体提交。

简而言之,您可以放心 col1 和 col2 只会被修改为单个原子单元。此外,如果被中断,提交将失败,对 col1 和 col2 的更改将被回滚。

于 2012-05-07T23:39:02.193 回答