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);
Exemple #3
0
		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);