Database.rollback ในรีลีส savepoint หรือไม่ Select for Update locks
ฉันพยายามทำความเข้าใจกลไกการล็อกของ Salesforce ฉันทำการทดสอบซึ่งทำสิ่งต่อไปนี้:
- เรียก Database.setSavepoint ()
- ออกแบบสอบถาม Select for Update
- เรียกใช้ Database.rollback (savepoint)
- ล่าช้าไปหลายวินาที
- ออกจากธุรกรรม
ฉันคาดว่าเธรดอื่น ๆ จะสามารถเข้าถึงบันทึกได้เมื่อแข่งขันขั้นตอนที่ 3 สิ่งที่ฉันเห็นคือในขณะที่การเปลี่ยนแปลงในเร็กคอร์ดถูกย้อนกลับไปทีละขั้นตอนที่ 3 เธรดอื่น ๆ ไม่สามารถเข้าถึงเรกคอร์ดได้จนกว่าจะถึงขั้นตอนที่ 5 กล่าวอีกนัยหนึ่งคือในขณะที่การเปลี่ยนแปลงอาจถูกย้อนกลับ แต่การล็อกจะไม่คลายออก
ความเข้าใจนี้ถูกต้องหรือไม่? มีวิธีใดบ้างที่จะปลดล็อคโดยการย้อนกลับ?
คำตอบ
ไม่มีเธรดใน Apex และการแบ่งเขตธุรกรรมใน SF คือ Sort of Squishy ™ การได้มาของการล็อคโดยSELECT..FOR UPDATEจะกระทำในบริบทของธุรกรรม ธุรกรรมนี้เป็น "พาเรนต์" ของธุรกรรมที่ดำเนินการโดยจุดบันทึกหนึ่งจุดขึ้นไป การล็อกจะถูกปลดเมื่อธุรกรรมหลักสิ้นสุดลง ... แต่การเรียกrollbackใช้ savepoint จะไม่มีผลกับธุรกรรมหลัก
โดยปกติ Savepoint จะใช้เป็นธุรกรรมที่ซ้อนกัน ธุรกรรมจะเริ่มต้นขึ้นและภายในธุรกรรมนั้นคุณสามารถรักษาสถานะของฐานข้อมูลผ่านทางบันทึก คุณสามารถทำได้หลายครั้ง ทุกครั้งที่คุณทำธุรกรรมที่ซ้อนกันใหม่จะเริ่มต้นขึ้นภายในพาเรนต์ เมื่อคุณย้อนกลับไปที่จุดประหยัดธุรกรรมหลักจะยังคงอยู่และดี
ในการนำไปใช้งานของ SF สิ่งนี้ง่ายต่อการพิสูจน์โดยพิจารณากรณีของจุดบันทึกหลายจุด:
Savepoint sp1 = Database.setSavepoint();
// do some work
Database.rollback(sp1);
Savepoint sp2 = Database.setSavepoint();
// do some more work
Database.rollback(sp2);
หากการเรียกครั้งแรกเพื่อrollbackยุติธุรกรรม "ระดับบนสุด" (ไม่ว่าจะเริ่มต้นที่ไหน) การเรียกครั้งที่สองrollbackจะมีปัญหา