Я вставки данных через SqlBulkCopy
так:SqlBulkCopy автоматически запускает транзакцию?
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlConnection con = new SqlConnection(connection))
{
con.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
}
Будет ли это автоматически завернутые в транзакции SQL, так что если что-то пойдет не так на полпути через БД будет оставаться в том же состоянии, как это было до того, как Началась навальная вставка? Или будет введена половина данных?
т.е. является необходимым для меня явно вызвать con.BeginTransaction
Или, если я называю конструктор SqlBulkCopy
«s, которая принимает строку, является то, что лучший способ получить это произойдет в сделке?
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
Я считаю docs немного неясным по этому вопросу, так как они изначально заявляют, что
По умолчанию основной операции копирования выполняются в изолированном операции. Операция массового копирования происходит в не-транзакционной образом, без возможности для прокатки его обратно
, но потом состояние
По умолчанию основная часть операции копирования его собственной транзакции. Когда вы хотите выполнить выделенную операцию массовой копии, создайте новый экземпляр из SqlBulkCopy со строкой подключения или используйте существующий объект SqlConnection без активной транзакции. В каждом сценарии операция массового копирования создает, а затем совершает или откатывает транзакцию .
Так это надо делать:
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlConnection con = new SqlConnection(connection))
{
con.Open();
using (SqlTransaction tr = con.BeginTransaction(IsolationLevel.Serializable))
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, tr))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
tr.Commit();
}
}
}
Почему вы не пробовали? И какая часть документации заставила вас думать, что это будет так? – TomTom
Эта часть: * По умолчанию операция массового копирования - это его собственная транзакция *, но затем она также говорит. * Операция массовой копии выполняется не трансактным способом, без возможности ее возврата *, поэтому ... это своего рода путают – Dan
Проверьте изменения. – mybirthname