ฤดูใบไม้ผลิ - การจัดการธุรกรรม

ธุรกรรมฐานข้อมูลคือลำดับของการดำเนินการที่ถือว่าเป็นหน่วยงานเดียว การดำเนินการเหล่านี้ควรเสร็จสิ้นทั้งหมดหรือไม่มีผลเลย การจัดการธุรกรรมเป็นส่วนสำคัญของแอปพลิเคชันระดับองค์กรที่มุ่งเน้น 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()

วิธีนี้ตั้งค่าธุรกรรมเป็นการย้อนกลับเท่านั้น