Tôi chèn dữ liệu thông qua SqlBulkCopy
như vậy:SqlBulkCopy có tự động bắt đầu một giao dịch không?
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);
}
}
}
Liệu điều này tự động được bao bọc trong một giao dịch SQL để nếu một cái gì đó đi cách nửa sai qua DB sẽ bị bỏ lại trong tình trạng tương tự như nó đã được trước chèn số lượng lớn đã bắt đầu? Hay một nửa dữ liệu sẽ được chèn vào?
nghĩa là nó cần thiết cho tôi để gọi một cách rõ ràng con.BeginTransaction
Hoặc nếu tôi gọi constructor SqlBulkCopy
's mà phải mất một chuỗi, đó là một cách tốt hơn để nhận nó xảy ra trong một giao dịch?
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
tôi tìm ra docs một chút không rõ ràng về vấn đề này khi họ bước đầu nêu rằng
Theo mặc định, một hoạt động sao chép số lượng lớn được thực hiện như một hoạt động cô lập. Các hoạt động sao chép số lượng lớn xảy ra trong một cách không giao dịch, không có cơ hội cho cán nó trở lại
nhưng sau đó nhà nước sau
Theo mặc định, một hoạt động sao chép số lượng lớn là giao dịch riêng của mình. Khi bạn muốn thực hiện thao tác sao chép hàng loạt chuyên dụng, hãy tạo một phiên bản mới của SqlBulkCopy bằng chuỗi kết nối hoặc sử dụng đối tượng SqlConnection hiện có mà không có giao dịch đang hoạt động. Trong mỗi trường hợp, thao tác sao chép hàng loạt sẽ tạo và sau đó cam kết hoặc cuộn lại giao dịch .
Vậy là nó cần thiết để làm:
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();
}
}
}
Tại sao bạn không thử? Và phần nào của tài liệu khiến bạn nghĩ rằng nó sẽ làm điều đó? – TomTom
Phần này: * Theo mặc định, thao tác sao chép số lượng lớn là giao dịch của chính nó * nhưng sau đó nó cũng cho biết * Thao tác sao chép hàng loạt diễn ra theo cách không giao dịch, không có cơ hội để quay lại * vì vậy ... đó là loại gây nhầm lẫn – Dan
Kiểm tra chỉnh sửa. – mybirthname