เพื่อทดสอบว่าธุรกรรมทำงานอย่างไร ฉันเขียน t-sql ต่อไปนี้ เนื่องจากแอตทริบิวต์แรกเป็นคีย์หลัก จึงไม่ควรคอมมิตการแทรกใดๆ แต่การแทรกครั้งแรกเกิดขึ้นแล้วเหรอ? ทำไม
begin transaction
insert into instructor
values ('99999', 'Yellow', 'Biology', 700000)
insert into instructor
values ('99999', 'Blue', 'Statistics', 85000)
commit;
select * from instructor where ID = '99999'
--delete from instructor where ID = '99999'
(1 แถวได้รับผลกระทบ) ข่าวสารเกี่ยวกับ 2627 ระดับ 14 สถานะ 1 บรรทัด 100 การละเมิดข้อจำกัดคีย์หลัก 'PK__instruct__3214EC278C8DA99F' ไม่สามารถแทรกคีย์ที่ซ้ำกันในวัตถุ 'dbo.instructor' ค่าคีย์ที่ซ้ำกันคือ (99999) แถลงการณ์ได้สิ้นสุดลงแล้ว
เวลาดำเนินการเสร็จสิ้น: 2019-11-06T14:02:27.3436411+02:00
XACT_ABORT
เป็นOFF
เนื่องจากการละเมิดคีย์ที่ซ้ำกันจะยกเลิกการแทรกครั้งที่สองเท่านั้น และไม่ใช่ธุรกรรมโดยรวม ดังนั้นCOMMIT
จึงยังคงเกิดขึ้น หากคุณทำSET XACT_ABORT ON
ก่อน การคอมมิตจะไม่เกิดขึ้น กฎเกณฑ์ที่แน่นอนสำหรับสิ่งที่ทำและไม่ยกเลิกธุรกรรมนั้น ซับซ้อนมาก แม้กระทั่ง ถ้าXACT_ABORT
สามารถทำให้สิ่งต่าง ๆ ง่ายขึ้นได้มาก - person Jeroen Mostert   schedule 06.11.2019