Tôi có thể sử dụng các giao dịch với một văn bản dữ liệu, để tôi có thể khôi phục trạng thái ngữ cảnh sau một lỗi không? Và nếu vậy, nó hoạt động như thế nào?Cách sử dụng các giao dịch với một văn bản dữ liệu
Trả lời
Tôi sử dụng chúng trong việc kiểm tra tất cả các thời gian :)
try
{
dc.Connection.Open();
dc.Transaction = dc.Connection.BeginTransaction();
dc.SubmitChanges();
}
finally
{
dc.Transaction.Rollback();
}
CẬP NHẬT
này sẽ LUÔN rollback sau khi thực tế. Tôi sử dụng nó trong thử nghiệm.
Something như thế này, có lẽ:
try
{
using (TransactionScope scope = new TransactionScope())
{
//Do some stuff
//Submit changes, use ConflictMode to specify what to do
context.SubmitChanges(ConflictMode.ContinueOnConflict);
scope.Complete();
}
}
catch (ChangeConflictException cce)
{
//Exception, as the scope was not completed it will rollback
}
Tại sao bỏ phiếu xuống? Một lời giải thích nhỏ sẽ không làm tổn thương ... – Philippe
Đây là câu trả lời hay nhất cho đến nay, IMO. Phạm vi giao dịch là con đường để đi. Điều này cũng chỉ định một ConflictMode và ít nhất là gợi ý một số hình thức xử lý lỗi thích hợp. Công việc tốt. – Triynko
Điều này làm việc cho tôi, cảm ơn @philippe. –
Một DataContext sẽ đón một giao dịch môi trường xung quanh theo mặc định, vì vậy nó chỉ là vấn đề đảm bảo có một giao dịch trong phạm vi. Các chi tiết trở thành vấn đề chính:
- Những tùy chọn nào bạn cần (ví dụ như mức độ cách ly)
- Bạn có muốn một giao dịch mới hoặc tái sử dụng một giao dịch hiện có (ví dụ như một hoạt động kiểm toán/khai thác gỗ có thể yêu cầu một giao dịch mới để nó có thể được cam kết ngay cả khi hoạt động kinh doanh tổng thể thất bại và do đó giao dịch bên ngoài được khôi phục).
Điều này được đơn giản hóa một số mã mẫu, mã thực sự sử dụng người trợ giúp để tạo giao dịch với các tùy chọn chính sách (một trong các mục đích của nguyên mẫu là để kiểm tra tác động của các tùy chọn này).
using (var trans = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions {
IsolationLevel = IsolationLevel.ReadCommitted
},
EnterpriseServicesInteropOption.Automatic)) {
// Perform operations using your DC, including submitting changes
if (allOK) {
trans.Complete();
}
}
Nếu Complete() không được gọi thì giao dịch sẽ được khôi phục. Nếu có một phạm vi giao dịch có chứa thì cả giao dịch bên trong và bên ngoài cần phải hoàn thành cho các thay đổi trên cơ sở dữ liệu được cam kết.
+1 để bao gồm thay đổi IsolationLevel cho SQL Server. Giải thích tại đây: http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx Tại sao EnterpriseServicesInteropOption.Automatic? –
allOK đến từ đâu? Intelli-type của tôi không phải là chọn nó lên. – Kukoy
@Fritos: Mã chạy trong giao dịch (ví dụ: thay thế cho nhận xét). – Richard
Nó không đơn giản như phương thức TransactionScope nhưng, như tôi đã hiểu, đây là cách "đúng" để làm điều đó cho LINQ-to-SQL. Nó không yêu cầu bất kỳ tham chiếu đến System.Transactions.
dataContext.Connection.Open();
using (dataContext.Transaction = dataContext.Connection.BeginTransaction())
{
dataContext.SubmitChanges();
if (allOK)
{
dataContext.Transaction.Commit();
}
else
{
dataContext.Transaction.RollBack();
}
}
Tất nhiên, chỉ cần RollBack nếu bạn định thực hiện thêm thao tác dữ liệu trong khi sử dụng, nếu không thay đổi sẽ tự động bị hủy.
allOK đến từ đâu? Intelli-type của tôi không phải là chọn nó lên. – Kukoy
@Fritos: Đó là mã giả – abatishchev
Điều này có vẻ đơn giản hơn câu trả lời được chấp nhận. Bất kỳ ý tưởng tại sao nó không phải là câu trả lời được chấp nhận? – ChrisFox
là một cái gì đó như thế này:
using (YourDatacontext m_DB = new YourDatacontext()) using (TransactionScope tran = new TransactionScope()) { try { //make here the changes m_DB.SubmitChanges(); tran.Complete(); } catch (Exception ex) { Transaction.Current.Rollback(); } }
- 1. Sử dụng các giao dịch STM và Cơ sở dữ liệu với nhau
- 2. Sử dụng các giao dịch với subsonic
- 3. Quản lý dữ liệu lõi Bản ghi giao dịch iCloud
- 4. Cách quyết định sử dụng các giao dịch cơ sở dữ liệu
- 5. Cách sử dụng i18next? Các vấn đề với bản dịch
- 6. Cách tốt nhất để dịch một lượng lớn dữ liệu văn bản là gì?
- 7. Giao dịch ứng dụng phi cơ sở dữ liệu
- 8. Giao dịch với mô hình dữ liệu Cassandra
- 9. Giao dịch cơ sở dữ liệu Magento
- 10. Nhiều Chủ đề truy cập vào cơ sở dữ liệu: một với giao dịch dài, một với các giao dịch ngắn
- 11. Lồng ghép RabbitMQ với các giao dịch cơ sở dữ liệu
- 12. Viết dữ liệu JSON vào một văn bản đơn giản
- 13. Cách sử dụng giao dịch (bắt đầu giao dịch, giao dịch cam kết)?
- 14. Sử dụng giao dịch thẻ tín dụng trung bình bao nhiêu dữ liệu?
- 15. sắp xếp dữ liệu văn bản lớn
- 16. Spring JPA Read Write splitting - có giao dịch sử dụng ghi nguồn dữ liệu
- 17. Hibernate PostInsertEventListeners -Sử dụng cùng một giao dịch như chèn?
- 18. Giao dịch Apache: ghi tệp giao dịch - cách sử dụng tài nguyênId
- 19. Tệp văn bản R và khai thác văn bản ... cách tải dữ liệu
- 20. Đơn vị công việc mẫu với các giao dịch cơ sở dữ liệu
- 21. Một câu lệnh sử dụng có hoàn trả một giao dịch cơ sở dữ liệu nếu xảy ra lỗi không?
- 22. Dữ liệu lớn chuyển thành "giao dịch" từ gói gói
- 23. Thực hiện các cấu trúc dữ liệu tùy chỉnh Sử dụng các giao thức Clojure
- 24. Sử dụng các giao dịch với quy trình nghiệp vụ và mẫu Kho lưu trữ
- 25. Bộ nhớ giao dịch phần mềm có giống giao dịch cơ sở dữ liệu không?
- 26. Sử dụng dịch vụ góc để chia sẻ dữ liệu giữa các bộ điều khiển
- 27. Giao dịch cơ sở dữ liệu CakePHP 2.3.x
- 28. Node.js + postgres quản lý cơ sở dữ liệu giao dịch
- 29. Làm cách nào để sử dụng các giao dịch với Stomp và ActiveMQ (và Perl)?
- 30. thêm văn bản vào một combobox với một nguồn dữ liệu
Bạn nên đề cập đến rằng _always_ mẫu của bạn trở lại trạng công việc của mình, hay tôi sai và dc.Transaction.Rollback() không có hại sau dc.SubmitChanges ()? – VVS
-1: Nên có khối sử dụng cho giao dịch thay vì thử/cuối cùng để đảm bảo dọn dẹp. – Richard
@Richard: Tôi đang đợi bạn một đoạn trích bằng cách sử dụng khối 'đang sử dụng' giống ngữ pháp của tôi. – leppie