ธุรกรรมมี 2 ประเภทหลักคือ ธุรกรรมการเชื่อมต่อและธุรกรรมโดยรอบ ธุรกรรมการเชื่อมต่อ (เช่น SqlTransaction) เชื่อมโยงโดยตรงกับการเชื่อมต่อฐานข้อมูล (เช่น SqlConnection) ซึ่งหมายความว่าคุณจะต้องผ่านการเชื่อมต่อ - ตกลงในบางกรณี แต่ไม่อนุญาต "สร้าง / ใช้ / ปล่อย" การใช้งานและไม่อนุญาตให้ทำงานข้ามฐานข้อมูล ตัวอย่าง (จัดรูปแบบสำหรับพื้นที่):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
ไม่ยุ่งเกินไป แต่ จำกัด เฉพาะการเชื่อมต่อของเรา "conn" ถ้าเราต้องการเรียกใช้วิธีการต่าง ๆ ตอนนี้เราต้องผ่าน "conn" รอบ ๆ
ทางเลือกคือธุรกรรมโดยรอบ ใหม่ใน. NET 2.0 วัตถุTransactionScope (System.Transactions.dll) อนุญาตการใช้งานในช่วงของการดำเนินงาน (ผู้ให้บริการที่เหมาะสมจะเข้าร่วมโดยอัตโนมัติในธุรกรรมโดยรอบ) สิ่งนี้ทำให้ง่ายต่อการปรับย้อนหลังให้เป็นรหัสที่มีอยู่ (ไม่ใช่การทำธุรกรรม) และพูดคุยกับผู้ให้บริการหลายราย (แม้ว่า DTC จะมีส่วนร่วมหากคุณพูดคุยมากกว่าหนึ่ง)
ตัวอย่างเช่น:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
โปรดทราบที่นี่ว่าทั้งสองวิธีสามารถจัดการการเชื่อมต่อของตนเอง (เปิด / ใช้ / ปิด / กำจัด) แต่พวกเขาจะกลายเป็นส่วนหนึ่งของการทำธุรกรรมโดยรอบโดยไม่ต้องให้เราผ่านสิ่งใด ๆ
หากรหัสของคุณมีข้อผิดพลาด Dispose () จะถูกเรียกโดยไม่มี Complete () ดังนั้นจึงจะถูกย้อนกลับ รองรับการซ้อนซ้อนที่คาดไว้ถึงแม้ว่าคุณจะไม่สามารถย้อนกลับธุรกรรมภายใน แต่ทำธุรกรรมภายนอกให้เสร็จสมบูรณ์ได้: หากใครไม่พอใจธุรกรรมจะถูกยกเลิก
ข้อดีอีกอย่างของ TransactionScope คือมันไม่ได้เชื่อมโยงกับฐานข้อมูลเท่านั้น ผู้ให้บริการที่รับรู้ถึงธุรกรรมสามารถใช้งานได้ ตัวอย่างเช่น WCF หรือมีบางรุ่นของวัตถุที่เข้ากันได้กับ TransactionScope (เช่นคลาส. NET ที่มีความสามารถในการย้อนกลับ - อาจจะง่ายกว่าของที่ระลึกถึงแม้ว่าฉันไม่เคยใช้วิธีการนี้ด้วยตนเอง)
สรุปวัตถุที่มีประโยชน์มาก ๆ
คำเตือนบางอย่าง:
- บน SQL Server 2000, TransactionScope จะไปที่ DTC ทันที สิ่งนี้ได้รับการแก้ไขใน SQL Server 2005 และสูงกว่ามันสามารถใช้ LTM (ค่าใช้จ่ายน้อยกว่ามาก) จนกว่าคุณจะพูดคุยกับแหล่งที่มา 2 แห่ง ฯลฯ เมื่อยกระดับเป็น DTC
- มีความผิดพลาดซึ่งหมายความว่าคุณอาจต้องปรับแต่งสตริงการเชื่อมต่อของคุณ