สมมติว่าฉันมีคำถาม:
begin tran
-- some other sql code
แล้วฉันก็ลืมที่จะกระทำหรือย้อนกลับไป
หากลูกค้ารายอื่นพยายามเรียกใช้แบบสอบถามจะเกิดอะไรขึ้น?
สมมติว่าฉันมีคำถาม:
begin tran
-- some other sql code
แล้วฉันก็ลืมที่จะกระทำหรือย้อนกลับไป
หากลูกค้ารายอื่นพยายามเรียกใช้แบบสอบถามจะเกิดอะไรขึ้น?
คำตอบ:
ตราบเท่าที่คุณไม่ได้ทำการCOMMITหรือROLLBACKการทำธุรกรรมมันยังคง "ทำงาน" และอาจมีการล็อก
หากไคลเอนต์ (แอปพลิเคชันหรือผู้ใช้) ของคุณปิดการเชื่อมต่อกับฐานข้อมูลก่อนที่จะดำเนินการธุรกรรมใด ๆ ที่ยังดำเนินอยู่จะถูกย้อนกลับและยุติลง
คุณสามารถลองทำด้วยตัวเองได้ซึ่งจะช่วยให้คุณรู้สึกได้ถึงวิธีการทำงานนี้
เปิดสองหน้าต่าง (แท็บ) ในสตูดิโอการจัดการแต่ละหน้าต่างจะมีการเชื่อมต่อกับ sql ของตัวเอง
ตอนนี้คุณสามารถเริ่มต้นธุรกรรมในหน้าต่างเดียวทำบางอย่างเช่นแทรก / อัปเดต / ลบ แต่ยังไม่ได้กระทำ จากนั้นในหน้าต่างอื่นคุณจะเห็นว่าฐานข้อมูลมีลักษณะอย่างไรจากภายนอกธุรกรรม ขึ้นอยู่กับระดับการแยกตารางอาจถูกล็อคจนกว่าหน้าต่างแรกจะถูกคอมมิตหรือคุณอาจ (ไม่) เห็นว่าธุรกรรมอื่น ๆ ทำอะไรไปแล้ว ฯลฯ
เล่นกับระดับการแยกที่แตกต่างกันและไม่มีคำใบ้ล็อคเพื่อดูว่าพวกเขามีผลต่อผลลัพธ์อย่างไร
และดูว่าเกิดอะไรขึ้นเมื่อคุณเกิดข้อผิดพลาดในการทำธุรกรรม
สิ่งสำคัญมากที่จะต้องเข้าใจว่าสิ่งเหล่านี้ทำงานอย่างไรหรือคุณจะนิ่งงันกับสิ่งที่ sql ทำหลาย ๆ ครั้ง
มีความสุข! GJ.
การทำธุรกรรมมีวัตถุประสงค์เพื่อดำเนินการอย่างสมบูรณ์หรือไม่ดำเนินการเลย วิธีเดียวในการทำธุรกรรมให้เสร็จสมบูรณ์คือการกระทำวิธีอื่นใดที่จะทำให้เกิดการย้อนกลับ
ดังนั้นหากคุณเริ่มต้นและไม่ทำการคอมมิตระบบจะย้อนกลับเมื่อปิดการเชื่อมต่อ (เนื่องจากธุรกรรมถูกทำลายโดยไม่ได้ทำเครื่องหมายว่าเสร็จสมบูรณ์)
ขึ้นอยู่กับระดับการแยกของธุรกรรมที่เข้ามา
เมื่อคุณเปิดธุรกรรมจะไม่มีอะไรถูกล็อคด้วยตัวมันเอง แต่ถ้าคุณดำเนินการค้นหาบางอย่างในธุรกรรมนั้นขึ้นอยู่กับระดับการแยกแถวตารางหรือเพจบางรายการจะถูกล็อกดังนั้นจะส่งผลต่อการสืบค้นอื่น ๆ ที่พยายามเข้าถึงจากธุรกรรมอื่น ๆ
ตัวอย่างการทำธุรกรรม
เริ่มต้น tran tt
คำสั่ง sql ของคุณ
หากเกิดข้อผิดพลาดย้อนกลับ tran tt else กระทำ tran tt
ตราบเท่าที่คุณยังไม่ได้ดำเนินการกระทำ tran tt ข้อมูลจะไม่ถูกเปลี่ยนแปลง
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
ไม่ทำงานเช่น ดูstackoverflow.com/questions/1273376/…
นอกจากปัญหาการล็อกที่อาจเกิดขึ้นแล้วคุณยังพบว่าบันทึกธุรกรรมของคุณเริ่มเพิ่มขึ้นเนื่องจากไม่สามารถตัดทอนได้เกิน LSN ขั้นต่ำสำหรับธุรกรรมที่ใช้งานอยู่และหากคุณใช้การแยกสแนปชอตที่เก็บเวอร์ชันของคุณใน tempdb จะเพิ่มขึ้น เหตุผลที่คล้ายกัน
คุณสามารถใช้dbcc opentran
เพื่อดูรายละเอียดของธุรกรรมที่เปิดเก่าที่สุด
ธุรกรรมที่ไม่มีข้อผิดพลาดใด ๆ จะทำให้เซิร์ฟเวอร์ถูกล็อกและคำค้นหาอื่น ๆ จะไม่ดำเนินการบนเซิร์ฟเวอร์ คุณจำเป็นต้องย้อนกลับธุรกรรมหรือยืนยัน การปิด SSMS จะเป็นการยุติธุรกรรมด้วยซึ่งจะทำให้การสืบค้นอื่นดำเนินการได้
ไม่ได้กำหนดลักษณะการทำงานดังนั้นคุณต้องตั้งค่าคอมมิตหรือการย้อนกลับอย่างชัดเจน:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
"หากปิดใช้งานโหมดการคอมมิตอัตโนมัติและคุณปิดการเชื่อมต่อโดยไม่ได้กระทำหรือย้อนกลับการเปลี่ยนแปลงล่าสุดของคุณอย่างชัดเจนการดำเนินการ COMMIT โดยปริยายจะถูกดำเนินการ"
Hsqldb ทำการย้อนกลับ
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
ผลลัพธ์คือ
2011-11-14 14: 20: 22,519 ข้อมูลหลัก [SqlAutoCommitExample: 55] [เปิดใช้งาน AutoCommit = false] 2011-11-14 14: 20: 22,546 ข้อมูลหลัก [SqlAutoCommitExample: 65] [พบ 0 # ผู้ใช้ในฐานข้อมูล]