public void Tran(IsolationLevel iso, DeadlockRetryConfig retry_config, TransactionalTask task) { EnsureOpen(); if (retry_config == null) { retry_config = this.DeadlockRetryConfig; } int num_retry = 0; LABEL_RETRY: try { using (UsingTran u = this.UsingTran(iso)) { if (task()) { u.Commit(); } } } catch (SqlException sqlex) { if (sqlex.Number == 1205) { // デッドロック発生 num_retry++; if (num_retry <= retry_config.RetryCount) { Kernel.SleepThread(Secure.Rand31i() % retry_config.RetryAverageInterval); goto LABEL_RETRY; } throw; } else { throw; } } }
public void Tran(IsolationLevel iso, TransactionalTask task) => Tran(iso, null, task);
public bool RunInTransaction(TransactionalTask transactionalTask) { bool shouldCommit = true; BeginTransaction(); try { shouldCommit = transactionalTask.Run(); } catch (Exception e) { shouldCommit = false; Log.E(Couchbase.Lite.Database.Tag, e.ToString(), e); throw new RuntimeException(e); } finally { EndTransaction(shouldCommit); } return shouldCommit; }
// トランザクションの実行 (匿名デリゲートを用いた再試行処理も実施) public void Tran(TransactionalTask task) => Tran(IsolationLevel.Serializable, null, task);
// トランザクションの実行 (匿名デリゲートを用いた再試行処理も実施) public void Tran(TransactionalTask task) => Tran(null, null, task);