ฤดูใบไม้ผลิ - การจัดการธุรกรรม
ธุรกรรมฐานข้อมูลคือลำดับของการดำเนินการที่ถือว่าเป็นหน่วยงานเดียว การดำเนินการเหล่านี้ควรเสร็จสิ้นทั้งหมดหรือไม่มีผลเลย การจัดการธุรกรรมเป็นส่วนสำคัญของแอปพลิเคชันระดับองค์กรที่มุ่งเน้น RDBMS เพื่อให้แน่ใจว่าข้อมูลมีความสมบูรณ์และสอดคล้องกัน แนวคิดของธุรกรรมสามารถอธิบายได้ด้วยคุณสมบัติหลักสี่ประการต่อไปนี้ที่อธิบายไว้ACID -
Atomicity - ธุรกรรมควรถือเป็นหน่วยการดำเนินการเดียวซึ่งหมายความว่าลำดับการดำเนินการทั้งหมดสำเร็จหรือไม่สำเร็จ
Consistency - แสดงถึงความสอดคล้องกันของความสมบูรณ์ของฐานข้อมูลคีย์หลักที่ไม่ซ้ำกันในตาราง ฯลฯ
Isolation- อาจมีการประมวลผลธุรกรรมหลายรายการด้วยชุดข้อมูลเดียวกันในเวลาเดียวกัน แต่ละธุรกรรมควรแยกออกจากผู้อื่นเพื่อป้องกันความเสียหายของข้อมูล
Durability - เมื่อทำธุรกรรมเสร็จเรียบร้อยแล้วผลลัพธ์ของธุรกรรมนี้จะต้องถูกทำให้ถาวรและไม่สามารถลบออกจากฐานข้อมูลได้เนื่องจากระบบล้มเหลว
ระบบฐานข้อมูล RDBMS จริงจะรับประกันคุณสมบัติทั้งสี่ประการสำหรับแต่ละธุรกรรม มุมมองที่เรียบง่ายของธุรกรรมที่ออกให้กับฐานข้อมูลโดยใช้ SQL มีดังนี้ -
เริ่มต้นธุรกรรมโดยใช้คำสั่ง start transaction
ดำเนินการลบอัปเดตหรือแทรกต่าง ๆ โดยใช้แบบสอบถาม SQL
หากการดำเนินการทั้งหมดสำเร็จให้ทำการคอมมิตมิฉะนั้นจะย้อนกลับการดำเนินการทั้งหมด
Spring framework จัดเตรียมเลเยอร์นามธรรมไว้ด้านบนของ API การจัดการธุรกรรมที่แตกต่างกัน การสนับสนุนการทำธุรกรรมของ Spring มีวัตถุประสงค์เพื่อเป็นทางเลือกให้กับธุรกรรม EJB โดยการเพิ่มความสามารถในการทำธุรกรรมให้กับ POJO Spring รองรับทั้งการจัดการธุรกรรมแบบเป็นโปรแกรมและแบบเปิดเผย EJB ต้องใช้แอ็พพลิเคชันเซิร์ฟเวอร์ แต่การจัดการธุรกรรม Spring สามารถดำเนินการได้โดยไม่ต้องใช้แอ็พพลิเคชันเซิร์ฟเวอร์
ธุรกรรมในพื้นที่กับทั่วโลก
ธุรกรรมภายในเฉพาะสำหรับทรัพยากรธุรกรรมเดียวเช่นการเชื่อมต่อ JDBC ในขณะที่ธุรกรรมส่วนกลางสามารถครอบคลุมทรัพยากรธุรกรรมหลายรายการเช่นธุรกรรมในระบบแบบกระจาย
การจัดการธุรกรรมภายในจะมีประโยชน์ในสภาพแวดล้อมการประมวลผลแบบรวมศูนย์ซึ่งส่วนประกอบของแอปพลิเคชันและทรัพยากรตั้งอยู่ที่ไซต์เดียวและการจัดการธุรกรรมจะเกี่ยวข้องกับตัวจัดการข้อมูลภายในที่ทำงานบนเครื่องเดียวเท่านั้น การทำธุรกรรมในพื้นที่ทำได้ง่ายกว่า
การจัดการธุรกรรมทั่วโลกจำเป็นในสภาพแวดล้อมการประมวลผลแบบกระจายซึ่งทรัพยากรทั้งหมดถูกกระจายไปยังระบบต่างๆ ในกรณีนี้การจัดการธุรกรรมจำเป็นต้องทำทั้งในระดับท้องถิ่นและระดับโลก ธุรกรรมแบบกระจายหรือทั่วโลกจะดำเนินการในหลายระบบและการดำเนินการนั้นต้องการการประสานงานระหว่างระบบการจัดการธุรกรรมทั่วโลกและตัวจัดการข้อมูลภายในของระบบที่เกี่ยวข้องทั้งหมด
แบบเป็นโปรแกรมเทียบกับการประกาศ
Spring รองรับการจัดการธุรกรรมสองประเภท -
การจัดการธุรกรรมแบบเป็นโปรแกรม - ซึ่งหมายความว่าคุณต้องจัดการธุรกรรมด้วยความช่วยเหลือของการเขียนโปรแกรม ทำให้คุณมีความยืดหยุ่นสูง แต่ดูแลรักษายาก
การจัดการธุรกรรมที่เปิดเผย - หมายความว่าคุณแยกการจัดการธุรกรรมออกจากรหัสธุรกิจ คุณใช้เฉพาะคำอธิบายประกอบหรือการกำหนดค่าตาม XML เพื่อจัดการธุรกรรม
การจัดการธุรกรรมแบบเปิดเผยเป็นที่นิยมมากกว่าการจัดการธุรกรรมแบบเป็นโปรแกรมแม้ว่าจะมีความยืดหยุ่นน้อยกว่าการจัดการธุรกรรมแบบเป็นโปรแกรมซึ่งช่วยให้คุณสามารถควบคุมธุรกรรมผ่านรหัสของคุณได้ แต่ในฐานะที่เป็นความกังวลแบบ crosscutting การจัดการธุรกรรมแบบเปิดเผยสามารถแยกส่วนได้ด้วยวิธี AOP Spring สนับสนุนการจัดการธุรกรรมที่เปิดเผยผ่านกรอบ Spring AOP
Spring Transaction Abstractions
กุญแจสำคัญในการนามธรรมธุรกรรม Spring ถูกกำหนดโดยอินเทอร์เฟซorg.springframework.transaction.PlatformTransactionManagerซึ่งมีดังต่อไปนี้ -
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
ซีเนียร์ No | วิธีการและคำอธิบาย |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) วิธีนี้จะส่งคืนธุรกรรมที่ใช้งานอยู่ในปัจจุบันหรือสร้างรายการใหม่ตามลักษณะการแพร่กระจายที่ระบุ |
2 | void commit(TransactionStatus status) วิธีนี้จะทำธุรกรรมที่กำหนดโดยคำนึงถึงสถานะ |
3 | void rollback(TransactionStatus status) วิธีนี้ดำเนินการย้อนกลับของธุรกรรมที่กำหนด |
TransactionDefinitionคืออินเตอร์เฟซหลักของการสนับสนุนการทำธุรกรรมในฤดูใบไม้ผลิและมันถูกกำหนดไว้ดังต่อไปนี้ -
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
ซีเนียร์ No | วิธีการและคำอธิบาย |
---|---|
1 | int getPropagationBehavior() วิธีนี้ส่งกลับพฤติกรรมการแพร่กระจาย Spring นำเสนอตัวเลือกการเผยแพร่ธุรกรรมทั้งหมดที่คุ้นเคยจาก EJB CMT |
2 | int getIsolationLevel() วิธีนี้จะคืนค่าระดับที่ธุรกรรมนี้แยกออกจากการทำงานของธุรกรรมอื่น ๆ |
3 | String getName() วิธีนี้จะส่งคืนชื่อของธุรกรรมนี้ |
4 | int getTimeout() วิธีนี้จะคืนค่าเวลาเป็นวินาทีที่ธุรกรรมต้องเสร็จสมบูรณ์ |
5 | boolean isReadOnly() วิธีนี้ส่งคืนว่าธุรกรรมเป็นแบบอ่านอย่างเดียวหรือไม่ |
ต่อไปนี้เป็นค่าที่เป็นไปได้สำหรับระดับการแยก -
ซีเนียร์ No | การแยกและคำอธิบาย |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT นี่คือระดับการแยกเริ่มต้น |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED แสดงว่ามีการป้องกันการอ่านสกปรก การอ่านที่ไม่สามารถทำซ้ำได้และการอ่านแบบหลอนสามารถเกิดขึ้นได้ |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED บ่งชี้ว่าการอ่านสกปรกการอ่านที่ไม่สามารถทำซ้ำได้และการอ่านแบบหลอนสามารถเกิดขึ้นได้ |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ ระบุว่าการอ่านสกปรกและการอ่านที่ไม่สามารถทำซ้ำได้ถูกป้องกัน การอ่านผีสามารถเกิดขึ้นได้ |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE บ่งชี้ว่าการอ่านสกปรกการอ่านที่ไม่สามารถทำซ้ำได้และการอ่านแบบหลอนถูกป้องกัน |
ต่อไปนี้เป็นค่าที่เป็นไปได้สำหรับประเภทการเผยแพร่ -
ซีเนียร์ | การขยายพันธุ์และคำอธิบาย |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY รองรับธุรกรรมปัจจุบัน แสดงข้อยกเว้นหากไม่มีธุรกรรมปัจจุบัน |
2 | TransactionDefinition.PROPAGATION_NESTED ดำเนินการภายในธุรกรรมที่ซ้อนกันหากมีธุรกรรมปัจจุบันอยู่ |
3 | TransactionDefinition.PROPAGATION_NEVER ไม่รองรับธุรกรรมปัจจุบัน แสดงข้อยกเว้นหากมีธุรกรรมปัจจุบันอยู่ |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED ไม่รองรับธุรกรรมปัจจุบัน ค่อนข้างจะดำเนินการโดยไม่ทำธุรกรรมเสมอ |
5 | TransactionDefinition.PROPAGATION_REQUIRED รองรับธุรกรรมปัจจุบัน สร้างใหม่หากไม่มีอยู่ |
6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW สร้างธุรกรรมใหม่ระงับธุรกรรมปัจจุบันหากมีอยู่ |
7 | TransactionDefinition.PROPAGATION_SUPPORTS รองรับธุรกรรมปัจจุบัน ดำเนินการโดยไม่ทำธุรกรรมหากไม่มีอยู่ |
8 | TransactionDefinition.TIMEOUT_DEFAULT ใช้การหมดเวลาเริ่มต้นของระบบธุรกรรมที่อยู่เบื้องหลังหรือไม่มีเลยหากไม่สนับสนุนการหมดเวลา |
TransactionStatusอินเตอร์เฟซให้เป็นวิธีที่ง่ายสำหรับรหัสการทำธุรกรรมที่จะดำเนินการทำธุรกรรมการควบคุมและสถานะการทำธุรกรรมแบบสอบถาม
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | boolean hasSavepoint() วิธีนี้จะส่งคืนว่าธุรกรรมนี้มีจุดบันทึกภายในหรือไม่กล่าวคือถูกสร้างขึ้นเป็นธุรกรรมที่ซ้อนกันโดยยึดตามจุดบันทึก |
2 | boolean isCompleted() วิธีนี้จะคืนค่าว่าธุรกรรมนี้เสร็จสมบูรณ์หรือไม่กล่าวคือไม่ว่าจะได้รับการยืนยันแล้วหรือย้อนกลับ |
3 | boolean isNewTransaction() วิธีนี้จะคืนค่าจริงในกรณีที่ธุรกรรมปัจจุบันเป็นธุรกรรมใหม่ |
4 | boolean isRollbackOnly() วิธีนี้จะคืนค่าว่าธุรกรรมถูกทำเครื่องหมายเป็นแบบย้อนกลับเท่านั้นหรือไม่ |
5 | void setRollbackOnly() วิธีนี้ตั้งค่าธุรกรรมเป็นการย้อนกลับเท่านั้น |