Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中读取未提交的事务_Java_Sql_Android_Database_Sqlite - Fatal编程技术网

Java 在Android中读取未提交的事务

Java 在Android中读取未提交的事务,java,sql,android,database,sqlite,Java,Sql,Android,Database,Sqlite,我有大量的数据库操作,这会给我的数据库增加大约10000条记录。因为这可能需要很长时间,所以最好使用事务 db.startTransaction(); .... do write operations. .... db.setTransactionSuccessful(); db.endTransaction(); 现在,我在事务中有一些读取操作,因为插入操作在endTransaction之前不会提交,所以不会获取这些记录。我听说过一种叫做事务隔离级别的东西,它使我们能够读取脏(未提交)记录。

我有大量的数据库操作,这会给我的数据库增加大约10000条记录。因为这可能需要很长时间,所以最好使用事务

db.startTransaction();
....
do write operations.
....
db.setTransactionSuccessful();
db.endTransaction();
现在,我在事务中有一些读取操作,因为插入操作在endTransaction之前不会提交,所以不会获取这些记录。我听说过一种叫做事务隔离级别的东西,它使我们能够读取脏(未提交)记录。你知道怎么做吗?

你试过吗

// outer transaction
db.startTransaction();
....

    //roll out a new transaction
    db.startTransaction();
    ....
    do write operations.
    ....
    db.setTransactionSuccessful();// <-- you do commint inside of this transaction

    // you can read data from here on from the previous committed transaction

....
db.setTransactionSuccessful();
db.endTransaction();
//外部事务
db.startTransaction();
....
//推出新交易
db.startTransaction();
....
执行写操作。
....

db.setTransactionSuccessful();// 我建议调用SQLite的SQL语句pragma:

database.execSQL("PRAGMA read_uncommitted = true;");
该语句表示查询将使用事务隔离级别READ_UNCOMMITTED,而不是READ_SERIALIZABLE(默认SQLite模式)


例如,我发现默认情况下,您可以读取尚未提交的记录。尽管如果您使用的是
SQliteOpenHelper
,此操作将失败。这是因为
SQliteOpenHelper
提供了两个单独的句柄(读写),未提交的写操作将无法从另一个句柄读取。
因此,如果要读取未限制的记录,请使用
SQLiteDatabase
class。

事务可以嵌套。这里的问题是什么?问题是我插入的任何内容在我提交之前都不“可读”。因为读取只发生在实际数据库中,而不是脏插入。我想我会试试看。另外,您是否错过了内部事务的endTransaction()?是的,我特意省略了当外部事务结束时,该事务中完成的所有工作以及所有嵌套事务都将提交或回滚。如果任何事务结束时未标记为干净(通过调用setTransactionSuccessful),则将回滚更改。否则它们将被提交。
但是,文档中还说,“在调用setTransactionSuccessful和调用endTransaction之间不要再做任何数据库工作…”这不会发生,因为您在上一次调用之前刚刚调用了另一个
setTransactionSuccessful
。手册上说这两者之间什么都不做。