Giả sử:
public class Foo {
public void Method1() {
using (TransactionScope scope = new TransactionScope()) {
// execute DB command 1
// execute DB command 2
scope.Complete(); // same as commit transaction
}
}
}
Các DB command nằm trong cùng một vùng và chia sẻ cùng một transaction. Cách viết này giúp cho các transaction lồng nhau được giải quyết rất gọn
public class Bar {
...
void OutMethod1() {
using (TransactionScope scope = new TransactionScope()) {
Foo foo = new Foo();
foo.Method1();
// execute another DB commands
scope.Complete();
}
}
}
OutMethod1() định nghĩ một scope cho foo.Method1() và các DB command của riêng nó, chúng cũng chia sẻ chung một transaction. Mã nguồn rất tuyệt!
Xét thêm tình huống sau: edit lại Foo.Method1()
public void Method1() {
using (TransactionScope scope = new TransactionScope()) {
// execute DB command 1
// execute DB command 2
scope.Complete(); // same as commit transaction
}
using (TransactionScope scope = new TransactionScope()) {
// execute DB command 3
// execute DB command 4
scope.Complete(); // same as commit transaction
}
}
Method1 định 2 vùng cho giao tác. Khi viết Method1() hoặc khi gọi Foo.Method1(), người viết sẽ đinh ninh rằng thất bại của commad4 không ảnh hưởng kết quả command 1 và 2 vì chúng khác scope.
Tuy nhiên, nếu client gọi Bar.OutMethod1(), kết quả là gì ? Cả 4 command lại có chung 1 scope => SO UGLY RESULT. Cùng một cách viết, nhưng lại cho ra 2 kết quả!!!
Trởi lại vấn đề cũ rích, sự tiện lợi và sự lạm dụng.
No comments:
Post a Comment