Ваш код не ОК.Существуют сценарии, в которых две базы данных не будут согласованы.
В своем коде вы создаете две локальные транзакции: одну в базе данных A и одну в базе данных B. Это не то, что вам нужно, поскольку вы хотите обе операциипроисходить в рамках одной транзакции, чтобы поддерживать последовательность.Для этого вам нужно использовать распределенную транзакцию, и, как вы упоминаете, TransactionScope
- лучший способ сделать это.Это также сделает код более читабельным.
например,
Database db_a = DatabaseFactory.CreateDatabase("Data Source=localhost;Initial Catalog=db_a");
Database db_b = DatabaseFactory.CreateDatabase("Data Source=localhost;Initial Catalog=db_b");
using (TransactionScope scope = new TransactionScope())
{
using (DbConnection connA = db_a.CreateConnection())
{
// ...
}
using (DbConnection connB = db_b.CreateConnection())
{
// ...
}
scope.Complete();
}
Я понимаю, что ваш код - упрощенный сценарий, поэтому я не уверен, применимы ли они к вашему фактическому коду, но вот некоторыедругие комментарии:
DbCommand dbCmd_dbB_delete =
db_a.GetSqlStringCommand("Insert INTO Employee(personId) VALUES(" + personID + ")");
Динамические строки SQL следует избегать.Они уязвимы для атак с использованием SQL-инъекций, а также снижают производительность, поскольку план выполнения базы данных не будет повторно использоваться для других запросов с другими параметрами.
finally
{
connection_db_a.Close();
connection_db_b.Close();
}
Вам не нужно вручную закрывать соединения, поскольку вы утилизируетесоединения через ваши операторы использования и Close и Dispose функционально эквивалентны.