它允许在Android SQLite中一次创建多个事务吗

它允许在Android SQLite中一次创建多个事务吗,android,multithreading,sqlite,transactions,Android,Multithreading,Sqlite,Transactions,读起来,它说SQLite支持事务和嵌套事务。我想知道是否有可能创建许多不同的交易 例如:我有两个线程访问一个数据库连接,是否可以在每个线程上创建一个事务,并且它们不是嵌套的?: 使用BEGIN…COMMIT创建的事务不嵌套。用于嵌套 事务,使用保存点和释放命令 我本人在使用SQLiteDatabase类的嵌套事务时遇到过死锁,因此我强烈建议您远离嵌套事务。使用您自己的锁来防止事务嵌套。在两个单独的线程上创建两个单独的事务不被视为“嵌套事务” 每个线程维护自己的db会话,该会话映射到0或1个db连

读起来,它说SQLite支持事务和嵌套事务。我想知道是否有可能创建许多不同的交易

例如:我有两个线程访问一个数据库连接,是否可以在每个线程上创建一个事务,并且它们不是嵌套的?

:

使用BEGIN…COMMIT创建的事务不嵌套。用于嵌套 事务,使用保存点和释放命令


我本人在使用SQLiteDatabase类的嵌套事务时遇到过死锁,因此我强烈建议您远离嵌套事务。使用您自己的锁来防止事务嵌套。

在两个单独的线程上创建两个单独的事务不被视为“嵌套事务”

每个线程维护自己的db会话,该会话映射到0或1个db连接(如果会话不再需要连接,则可以从连接池中选择db连接并返回给它,因此在任何时候,会话都有连接或没有连接,这取决于它是否需要)

因此,每个线程独立于其他线程维护自己的传输状态。消息来源证实了这一点:

../Android/sdk/sources/Android-23/Android/database/sqlite/SQLiteDatabase.java:

// Thread-local for database sessions that belong to this database.
// Each thread has its own database session.
// INVARIANT: Immutable.
private final ThreadLocal<SQLiteSession> mThreadSession = new ThreadLocal<SQLiteSession>() {
    @Override
    protected SQLiteSession initialValue() {
        return createSession();
    }
};
因此,如果有两个事务在不同的线程中进行,它们不是“嵌套”的,而是完全独立的,并且将并行运行或序列化,具体取决于所涉及事务的模式和类型(即,它们是延迟的、即时的、排他的,还是读写的)

但是,必须正确使用androidsqlite库来实现这一点

我有两个线程访问数据库连接

如果这意味着两个线程使用相同的SQLiteSession(尽管我不确定如果可能的话如何实现),那么很可能会导致死锁

我的设置:

  • 单一内容提供商
  • 内容提供程序在其onCreate()中初始化SQLiteOpenHelper的成员变量mDbHelper
  • 根据需要在内容提供程序的查询/insert/…中调用mHelper.getReadableDatabase/getWriteableDatabase。。。方法
  • Android将确保使用内容提供商的每个线程上都有单独的事务状态
  • 如果在线程上执行长时间的事务(例如从后台线程中同步导入数据),请考虑使用<代码> dB。挤进去,这样他们就不必等待长时间运行的事务完成,从而阻塞那些线程

     * <h2>About database sessions</h2>
     * <p>
     * Database access is always performed using a session.  The session
     * manages the lifecycle of transactions and database connections.
     * </p><p>
    
    * Consequently, each thread
     * has its own session object and therefore its own transaction state independent
     * of other threads.