/// <summary> /// Добавляет столбец в таблицу. /// </summary> /// <param name="columnName"></param> internal override void AddColumnInternal(string columnName) { if (string.IsNullOrEmpty(columnName)) { throw new ArgumentNullException("columnName"); } //запускаем код в одной общей Sql-транзакции. using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope()) { //добавляем столбец в основную таблицу. base.AddColumnInternal(columnName); //инициализируем триггеры this.InitPrincipalTriggers(); //завершаем область транзакций. transactionScope.Complete(); } }
/// <summary> /// Выполняет код в транзакции запроса к базам данных. /// </summary> /// <param name="transactionCode">Код для выполнения в транзакции.</param> /// <param name="createNew">При установленном значении true, создаёт новую транзакцию даже при наличии транзакции уже инициализированной в контексте выполнения кода.</param> private void ExecuteTransactionInternal(TransactionCode transactionCode, bool createNew) { //создаем область транзакции. DBTransactionScope transactionScope = this.CreateTransactionScope(createNew); Exception transactionException = null; try { using (OperationContext executeTransactionContext = this.RunExecuteTransactionContext()) { //выполняем код. transactionCode(); //помечаем транзакцию, как успешно выполненную. transactionScope.Complete(); } } catch (Exception ex) { //устанавливаем ошибку транзакции. transactionException = ex; //логируем ошибку транзакции. this.WriteEventLog(transactionException); //перенаправляем ошибку транзакции вверх по стэку. throw; } finally { //выполняем очистку области транзакции. Exception disposeException = null; try { //очищаем область транзакции. transactionScope.Dispose(); } catch (Exception ex) { //устанавливаем ошибку очистки. disposeException = ex; //логируем ошибку очистки. this.WriteEventLog(disposeException); //перенаправляем ошибку очистки вверх по стэку. throw; } finally { //обрабатываем ошибку транзакции и ошибку очистки. if (transactionException != null && disposeException != null) { //перенаправляем вверх по стэку суммарную ошибку транзакции и очистки. throw new Exception(string.Format(@"Возникли ошибки при выполнении и очистки транзакции. ExecuteTransactionError: {0} DisposeTransactionError: {1}", transactionException, disposeException)); } } } }