Пример #1
0
        private void cleanUpDatabaseConnection(DBConnection connection)
        {
            // Keep the connection initialized during cleanup to accommodate commit-time validation methods.
            try {
                try {
                    if (!DataAccessStatics.DatabaseShouldHaveAutomaticTransactions(connection.DatabaseInfo))
                    {
                        return;
                    }

                    try {
                        if (!transactionMarkedForRollback)
                        {
                            connection.CommitTransaction();
                        }
                    }
                    catch {
                        // Modifying this boolean here means that the order in which connections are cleaned up matters. Not modifying it here means
                        // possibly committing things to secondary databases that shouldn't be committed. We've decided that the primary connection
                        // is the most likely to have these errors, and is cleaned up first, so modifying this boolean here will yield the best results
                        // until we implement a true distributed transaction model with two-phase commit.
                        transactionMarkedForRollback = true;

                        throw;
                    }
                    finally {
                        if (transactionMarkedForRollback)
                        {
                            connection.RollbackTransaction();
                        }
                    }
                }
                finally {
                    connection.Close();
                }
            }
            finally {
                if (connection.DatabaseInfo.SecondaryDatabaseName.Any())
                {
                    secondaryDatabasesWithInitializedConnections.Remove(connection.DatabaseInfo.SecondaryDatabaseName);
                }
                else
                {
                    primaryDatabaseConnectionInitialized = false;
                }
            }
        }
Пример #2
0
 internal void PreExecuteCommitTimeValidationMethodsForAllOpenConnections()
 {
     if (primaryDatabaseConnectionInitialized)
     {
         var connection = DataAccessState.Current.PrimaryDatabaseConnection;
         if (DataAccessStatics.DatabaseShouldHaveAutomaticTransactions(connection.DatabaseInfo))
         {
             connection.PreExecuteCommitTimeValidationMethods();
         }
     }
     foreach (var databaseName in secondaryDatabasesWithInitializedConnections)
     {
         var connection = DataAccessState.Current.GetSecondaryDatabaseConnection(databaseName);
         if (DataAccessStatics.DatabaseShouldHaveAutomaticTransactions(connection.DatabaseInfo))
         {
             connection.PreExecuteCommitTimeValidationMethods();
         }
     }
 }
Пример #3
0
        private void initDatabaseConnection(DBConnection connection)
        {
            if (connection.DatabaseInfo.SecondaryDatabaseName.Any()
                                    ? secondaryDatabasesWithInitializedConnections.Contains(connection.DatabaseInfo.SecondaryDatabaseName)
                                    : primaryDatabaseConnectionInitialized)
            {
                return;
            }

            connection.Open();
            if (DataAccessStatics.DatabaseShouldHaveAutomaticTransactions(connection.DatabaseInfo))
            {
                connection.BeginTransaction();
            }

            if (connection.DatabaseInfo.SecondaryDatabaseName.Any())
            {
                secondaryDatabasesWithInitializedConnections.Add(connection.DatabaseInfo.SecondaryDatabaseName);
            }
            else
            {
                primaryDatabaseConnectionInitialized = true;
            }
        }