มือใหม่ในฐานข้อมูลทำงานมากดังนั้นขอขอบคุณที่กรุณาอดทนรอด้วยคำถามพื้นฐาน ฉันใช้ SQL Server 2014 บนเครื่องของฉันและฉันมีตารางเล็ก ๆ และแอปพลิเคชันไคลเอนต์ขั้นพื้นฐานเพื่อทดสอบวิธีการต่าง ๆ ด้วย ฉันได้สิ่งที่ดูเหมือนจะล็อคตารางระหว่างทั้งสองINSERT INTO
และUPDATE
งบ ไคลเอนต์เป็นแอปพลิเคชัน ASP.NET ด้วยรหัสต่อไปนี้:
OleDbConnection cn = new OleDbConnection("Provider=SQLNCLI11; server=localhost\\SQLEXPRESS; Database=<my db>; user id=<my uid>; password=<my pwd>");
cn.Open();
OleDbTransaction tn = cn.BeginTransaction();
OleDbCommand cmd = new OleDbCommand("INSERT INTO LAYOUTSv2 (LAYOUTS_name_t, LAYOUTS_enabled_b, LAYOUTS_data_m) VALUES ('name', '-1', 'data')", cn, tn);
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT SCOPE_IDENTITY()";
int newkey = Decimal.ToInt32((decimal)cmd.ExecuteScalar());
Console.WriteLine("Created index " + newkey);
Thread.Sleep(15000);
tn.Commit();
tn = cn.BeginTransaction();
cmd.CommandText = "UDPATE LAYOUTSv2 SET LAYOUTS_enabled_b='-3' WHERE LAYOUTS_key='" + newkey + "'";
cmd.Transaction = tn;
cmd.ExecuteNonQuery();
Console.WriteLine("updated row");
Thread.Sleep(15000);
tn.Rollback();
cn.Close();
SELECT * FROM LAYOUTSv2
ฉันเรียกใช้รหัสนี้แล้วจากการบริหารจัดการสตูดิโอผมวิ่ง ระหว่างทั้งสองกรณีเมื่อไคลเอ็นต์เธรดถูกหยุดชั่วคราว (เช่นก่อนที่จะคอมมิต / ย้อนกลับ) เคียวรี SELECT จะค้างจนกว่าการคอมมิชชัน / การย้อนกลับจะเกิดขึ้น
ตารางมีฟิลด์ LAYOUTS_key ที่กำหนดเป็นคีย์หลัก ในหน้าต่างคุณสมบัติมันแสดงให้เห็นว่ามันเป็นเอกลักษณ์และคลัสเตอร์ที่มีการล็อคหน้าและล็อคแถวทั้งสองได้รับอนุญาต การตั้งค่าการเลื่อนล็อคสำหรับตารางนั้นปิดใช้งาน ... ฉันได้ลองทั้งการตั้งค่าอื่น ๆ ที่มีในตารางและอัตโนมัติโดยไม่มีการเปลี่ยนแปลง ฉันได้พยายามSELECT ... WITH (NOLOCK)
และผลตอบแทนผลทันที แต่เป็นเป็นอย่างดีเตือนที่นี่และที่อื่น ๆ มันไม่ได้เป็นสิ่งที่ฉันควรจะทำ ฉันได้ลองใส่ROWLOCK
คำใบ้ทั้งบนINSERT
และUPDATE
ข้อความ แต่ก็ไม่มีอะไรเปลี่ยนแปลง
พฤติกรรมที่ฉันกำลังมองหาคือ: ก่อนที่จะกระทำการINSERT
แบบสอบถามจากเธรดอื่น ๆ อ่านทุกแถวยกเว้นที่กำลังINSERT
แก้ไขอยู่ ก่อนที่จะส่งUPDATE
แบบสอบถามจากเธรดอื่นให้อ่านเวอร์ชันเริ่มต้นของแถวที่กำลังUPDATE
แก้ไข มีวิธีใดบ้างที่ฉันสามารถทำได้ หากฉันต้องการให้ข้อมูลอื่น ๆ เพื่อชี้แจงกรณีการใช้ของฉันโปรดแจ้งให้เราทราบ ขอบคุณ
newkey
เป็น " something';DELETE FROM LAYOUTSv2 --
" การอัปเดตของคุณจะเสร็จสมบูรณ์แล้วจากนั้นทำให้ตารางว่างเปล่าเนื่องจากผู้ใช้จัดการแบบสอบถามโดยใส่เครื่องหมายอัญประกาศเดี่ยว โดยทั่วไปแบบสอบถามที่มีพารามิเตอร์จะมีลักษณะดังนี้UDPATE LAYOUTSv2 SET LAYOUTS_enabled_b='-3' WHERE LAYOUTS_key=?
หลังจากที่คุณกำหนดค่าให้กับ?
(พารามิเตอร์) ในรหัสของคุณ
WHERE LAYOUTS_key='" + newkey + "'
การที่ไม่มีความสมบูรณ์ด้วยเหตุผลต่างๆรวมถึงการฉีด SQL คุณควรใช้แบบสอบถามแบบใช้พารามิเตอร์