Database.rollback ในรีลีส savepoint หรือไม่ Select for Update locks

Sep 05 2020

ฉันพยายามทำความเข้าใจกลไกการล็อกของ Salesforce ฉันทำการทดสอบซึ่งทำสิ่งต่อไปนี้:

  1. เรียก Database.setSavepoint ()
  2. ออกแบบสอบถาม Select for Update
  3. เรียกใช้ Database.rollback (savepoint)
  4. ล่าช้าไปหลายวินาที
  5. ออกจากธุรกรรม

ฉันคาดว่าเธรดอื่น ๆ จะสามารถเข้าถึงบันทึกได้เมื่อแข่งขันขั้นตอนที่ 3 สิ่งที่ฉันเห็นคือในขณะที่การเปลี่ยนแปลงในเร็กคอร์ดถูกย้อนกลับไปทีละขั้นตอนที่ 3 เธรดอื่น ๆ ไม่สามารถเข้าถึงเรกคอร์ดได้จนกว่าจะถึงขั้นตอนที่ 5 กล่าวอีกนัยหนึ่งคือในขณะที่การเปลี่ยนแปลงอาจถูกย้อนกลับ แต่การล็อกจะไม่คลายออก

ความเข้าใจนี้ถูกต้องหรือไม่? มีวิธีใดบ้างที่จะปลดล็อคโดยการย้อนกลับ?

คำตอบ

4 identigral Sep 05 2020 at 05:09

ไม่มีเธรดใน 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จะมีปัญหา