Android,嵌套交易不起作用

时间:2013-12-17 07:23:30

标签: android sqlite transactions

Heloou,我试图做一个嵌套事务,但是抛出SqliteDatabaseLockedException,我不确定为什么......

数据源open()方法将可写数据库分配给它们各自的属性,以便稍后调用方法来操作数据。他们都使用SQLHelpder返回一个writableDatabase。

@Override
        protected Boolean doInBackground(String... url) {

            try {
                clientDataSource.open();
                movementDataSource.open();

                clientDataSource.getDatabase().beginTransaction();
                movementDataSource.getDatabase().beginTransaction();

                if(sendMovements()) {
                    movementDataSource.getDatabase().setTransactionSuccessful();
                    clientDataSource.deleteAllClients();
                }
                updateDatabase(url[0]);
                clientDataSource.getDatabase().setTransactionSuccessful();
            } catch (JSONException e) {
                //Treat Json Exception
            } catch (IOException e) {
                //Treat IOException
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                movementDataSource.getDatabase().endTransaction();
                clientDataSource.getDatabase().endTransaction();
            }

            return true;
        }

1 个答案:

答案 0 :(得分:0)

这是sqlite docs的形式,这就是它所说的

在EXCLUSIVE模式下开始交易。

交易可以嵌套。当外部事务结束时,该事务中完成的所有工作以及所有嵌套事务都将被提交或回滚。如果任何事务结束而没有标记为干净(通过调用setTransactionSuccessful),则将回滚更改。否则他们将被承诺。

以下是交易的标准惯用语:

   db.beginTransaction();
   try {
     ...
     db.setTransactionSuccessful();
   } finally {
     db.endTransaction();
   }

所以,除非你在调用成功后标记你的事务结束,否则会导致数据库锁定错误,最终这就是你的行为。

movementDataSource.getDatabase()setTransactionSuccessful(); //调用此函数后,结束此事务,否则将导致数据库锁定错误。