[SQL Server] ปัญหา row cannot be located for updating. some values may have been changed since it was last read

ปัญหา row cannot be located for updating. some values may have been changed since it was last read สาเหตุ เกิดจากการตารางที่โปรแกรม หรือ App ที่เรากำลังพัฒนาได้ถูกใช้งานอยู่ หากใครเคยเรียน DB มา มีศัพท์เทคนิคอีกย่างนึง เรียกว่า Isolation Level นั้นเอง โดยสามารถเกิดได้จาก 2 กรณี ดังนี้ วิธีการแก้ไข

2013-10-02_234755

กรณีที่ 1: ให้ตรวจสอบตารางที่เกี่ยวข้องกับหน้าจอนั้น ว่ามี Trigger ที่เกี่ยวข้อง หรือไม่ ถ้ามี

  • ถ้ามีให้ทดสอบ Disable ไปก่อน เพื่อแล้วทดสอบการทำงานของระบบ ถ้าสามารถทำงานได้แสดงว่าสาเหตุเกิดจาก Trigger ให้ทำการแก้ไข Trigger โดยการเพิ่มคำสั่ง  SET NOCOUNT ON เพื่อไม่ให้ Trigger คืนค่าจำนวน Row ที่ Trigger ได้ทำงานไป เพราะ ตัว ADO หรือ ADO.NET อาจจะเข้าใจผิดว่าการทำงานนั้นเสร็จเรียบร้อยไปแล้ว ทั้งๆที่ยังมีการ Insert/Update หรือ Delete กับฐานข้อมูลรออยู่ โดยการเพิ่มคำสั่ง  SET NOCOUNT ON สามารถดูตัวอย่างได้ ดังนี้
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
Go
 
ALTER TRIGGER [NSECURITYEQ]
ON [INVEST].[EQUITY]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE SECURITY SET SECURITY.MATURITYDATE = (SELECT CLOSEDDATE FROM INSERTED)
    WHERE SECURITY.SECURITYID  = (SELECT SECURITYID FROM INSERTED)
END

กรณีที่ 2: ถ้าทดสอบแล้ว ไม่เกี่ยวกับตัว Trigger ไปตรวจสอบการตั้งค่า Isolation level ของฐานข้อมูล และปรับแก้ไขให้เหมาะสมครับ

แหล่งข้อมูล


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.