它允许在Android SQLite中一次创建多个事务吗
读起来,它说SQLite支持事务和嵌套事务。我想知道是否有可能创建许多不同的交易 例如:我有两个线程访问一个数据库连接,是否可以在每个线程上创建一个事务,并且它们不是嵌套的?: 使用BEGIN…COMMIT创建的事务不嵌套。用于嵌套 事务,使用保存点和释放命令它允许在Android SQLite中一次创建多个事务吗,android,multithreading,sqlite,transactions,Android,Multithreading,Sqlite,Transactions,读起来,它说SQLite支持事务和嵌套事务。我想知道是否有可能创建许多不同的交易 例如:我有两个线程访问一个数据库连接,是否可以在每个线程上创建一个事务,并且它们不是嵌套的?: 使用BEGIN…COMMIT创建的事务不嵌套。用于嵌套 事务,使用保存点和释放命令 我本人在使用SQLiteDatabase类的嵌套事务时遇到过死锁,因此我强烈建议您远离嵌套事务。使用您自己的锁来防止事务嵌套。在两个单独的线程上创建两个单独的事务不被视为“嵌套事务” 每个线程维护自己的db会话,该会话映射到0或1个db连
我本人在使用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(尽管我不确定如果可能的话如何实现),那么很可能会导致死锁
我的设置:
如果在线程上执行长时间的事务(例如从后台线程中同步导入数据),请考虑使用<代码> 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.