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; } } }
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(); } } }
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; } }