รับธุรกรรมที่ล้มเหลวหรือไม่เคยกระทำ


คำตอบ:


5

ไม่ SQL Server จะไม่รักษาประวัติใด ๆ เกี่ยวกับธุรกรรมที่ถูกยกเลิก / ย้อนกลับที่ไม่สำคัญในการเข้าถึงและไม่แนะนำปัญหาที่อาจเกิดขึ้นเพิ่มเติม (ดังที่อธิบายไว้ในคำตอบของ @ ooutwire ) หรือแม้กระทั่งธุรกรรมที่ได้กระทำไปแล้ว

คุณจะต้องทำการบันทึกของคุณเองภายในการจัดการข้อผิดพลาดของคุณหรือจับภาพเหตุการณ์เฉพาะธุรกรรมที่เกี่ยวข้องโดยใช้การติดตามฝั่งเซิร์ฟเวอร์หรือเหตุการณ์ขยาย

ติดตาม:

ป้อนคำอธิบายรูปภาพที่นี่

เหตุการณ์ขยาย:

ป้อนคำอธิบายรูปภาพที่นี่


แน่นอนว่ามันอยู่ในไฟล์บันทึกและไฟล์สำรองข้อมูล
ooutwire

1
@ooutwire และคุณจะไปถึงคนเหล่านั้นได้อย่างง่ายดายได้อย่างไร? และคุณจะไปหาพวกเขาได้อย่างไรหากพวกเขาไม่อยู่ในบันทึกอีกต่อไป? บันทึกข้อมูลเหล่านั้นเป็นสิ่งที่ดีที่สุด
Aaron Bertrand

ดูคำตอบของฉัน วิธีที่ดีที่สุดคือการสร้างการสำรองข้อมูลบันทึกบ่อยๆ ฉันจะยอมรับว่าวิธีการแก้ปัญหาดังกล่าวไม่เหมาะ แต่ฉันไม่เห็นเหตุผลว่าทำไมฉันจะค้นหาตลอดเวลาในการทำธุรกรรมที่ถูกยกเลิก ถ้านั่นคือความปรารถนามากกว่าร่องรอยหรือ XEvent ดูเหมือนจะเป็นทางออกที่ชาญฉลาด
ooutwire

2
ฉันเห็นคำตอบของคุณแน่นอน ผมบอกว่าได้อย่างง่ายดายและยังควรจะพูดได้อย่างน่าเชื่อถือ :-)
Aaron Bertrand

6
ฉันกับ @AaronBertrand บนอันนี้ ด้วยปัญหาที่ต้องใช้เพื่อจัดการกับบันทึกการทำธุรกรรม ( หมายเหตุ: ไม่ใช่สิ่งที่พวกเขาตั้งใจไว้ ) คุณอาจสร้างเซสชัน XE ที่มีน้ำหนักเบาสำหรับการแก้ไขปัญหานี้
Thomas Stringer

4

เมื่อคุณพูดว่าการทำธุรกรรม "ล้มเหลว" คุณหมายถึงอะไร?

หากคุณต้องการดูธุรกรรมปัจจุบันในอินสแตนซ์คุณสามารถใช้sys.dm_tran_active_transactionsDMV

นอกจากนี้ยังsys.dm_exec_sessionsมีสิ่งopen_transaction_countที่สามารถให้ข้อมูลนี้แก่คุณตามช่วงเวลา ด้านล่างนี้เป็นคิวรีการวิเคราะห์เพื่อดึงกระบวนการผู้ใช้ทั้งหมดที่มีธุรกรรมเปิดอยู่:

select 
    s.session_id,
    s.login_name,
    s.open_transaction_count,
    st.text as most_recent_sql_text
from sys.dm_exec_sessions s
inner join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) st
where s.is_user_process = 1
and s.open_transaction_count > 0;

ข้อมูลนี้สามารถดึงได้จากsys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

หากคุณต้องการจับภาพเมื่อธุรกรรมถูกย้อนกลับ (สมมติว่าคุณต้องการทำธุรกรรม "ล้มเหลว" มาก) คุณสามารถจับภาพเหตุการณ์ขยายrollback_tran_completedได้ หากคุณกำลังมองหามุมมองการทำธุรกรรม "ทุกอย่าง" คุณสามารถจับภาพsql_transactionเหตุการณ์ซึ่งกำหนดโดย SQL Server คือ

เกิดขึ้นเมื่อการทำธุรกรรม SQL Server เริ่มต้นเสร็จสมบูรณ์ย้อนกลับหรือดำเนินการ savepoint ใช้เหตุการณ์นี้เพื่อตรวจสอบพฤติกรรมการทำธุรกรรมเมื่อการแก้ไขปัญหาแอปพลิเคชันทริกเกอร์หรือขั้นตอนการจัดเก็บ


4

คุณสามารถใช้ fn_dblog () และค้นหา ID ธุรกรรมสำหรับธุรกรรมที่ถูกยกเลิกรวมถึงโฮสต์ของข้อมูลที่เป็นประโยชน์อื่น ๆ

เลือก * 
จาก fn_dblog (NULL, NULL)
WHERE Operation = 'LOP_ABORT_XACT';
ไป

มันจะสแกนบันทึกธุรกรรมทั้งหมดในส่วนที่ใช้งานอยู่ของบันทึก สิ่งนี้สามารถ over-ridden โดยใช้การตั้งค่าสถานะการสืบค้นกลับ 2537 ซึ่งจะช่วยให้คุณย้อนกลับไปไกลที่สุดเท่าที่จะเป็นไปได้สำหรับการเริ่มต้นของ VLF "un-reused" ที่เก่าแก่ที่สุด ระวังเมื่อใช้ฟังก์ชั่นนี้เนื่องจากมันจะสแกนบันทึกแบบสุ่มและบันทึกจะไม่สามารถเปลี่ยนแปลงได้เมื่อการสแกนเกิดขึ้น ดังนั้นคุณอาจเห็นบันทึกการเติบโต

คุณยังสามารถใช้ fn_dump_dblog กับไฟล์สำรองข้อมูลบันทึก

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