การวางคำสั่ง Select ในธุรกรรม


10

ข้อแตกต่างระหว่าง 2 ข้อความค้นหาเหล่านี้คืออะไร:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

และไม่มีการทำธุรกรรม:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

ผลของการมีSELECTการทำธุรกรรมภายในคืออะไร?

หากDELETE FROM orders WHERE id=1ถูกเรียกจากเซสชันอื่นหลังจากSELECTทั้งสองกรณีจะถูกประมวลผลเมื่อใด

คำตอบ:


5

แบบสอบถาม SELECT ภายในธุรกรรมในตัวเองไม่ได้ป้องกันอย่างถูกต้องจากการปรับปรุงและลบ

สิ่งที่คุณต้องใช้ดังต่อไปนี้:

หากคุณออกDelete From orders Where id=1มันจะเกิดขึ้นเมื่อแถวในordersตารางปลดล็อคของพวกเขาเมื่อสิ้นสุดการทำธุรกรรม คุณสามารถทดลอง (บนเซิร์ฟเวอร์ Dev / Staging ได้โปรด) ด้วยการใช้READ UNCOMMITTEDระดับการแยกธุรกรรมเพื่อทำให้การลบเกิดขึ้นอย่างมีเหตุผล แต่จะส่งผลให้มองเห็นและบันทึกอย่างถาวร

ในการทำธุรกรรมครั้งที่สองโดยทั่วไปการเดิมพันทั้งหมดจะปิด ถ้าคุณวิ่ง

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

วิ่งDelete From orders Where id=1จะกระทำทันที คุณจะเห็นแถวลบ (หรือไม่เห็น) ทั้งนี้ขึ้นอยู่กับคำสั่งที่ MySQL เรียกใช้งานคำสั่งเหล่านี้

ข้อแม้

MySQL 5.6 มีดังต่อไปนี้ :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

ตัวอ่าน READ WRITE และ READ ONLY เท่านั้นที่ตั้งค่าโหมดการเข้าถึงธุรกรรม พวกเขาอนุญาตหรือห้ามการเปลี่ยนแปลงตารางที่ใช้ในการทำธุรกรรม ข้อ จำกัด ของ READ ONLY ป้องกันการทำธุรกรรมจากการปรับเปลี่ยนหรือล็อคตารางธุรกรรมและธุรกรรมที่ไม่ใช่ธุรกรรมที่มองเห็นได้ในธุรกรรมอื่น ๆ การทำธุรกรรมยังคงสามารถแก้ไขหรือล็อคตารางชั่วคราว ตัวดัดแปลงเหล่านี้มีให้ใน MySQL 5.6.5

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.