คำถามติดแท็ก locking

กลไกในการจัดการการเข้าถึงข้อมูลหรือทรัพยากรที่แชร์พร้อมกันโดยการให้สิทธิ์การเข้าถึงแบบเอกสิทธิ์เฉพาะบุคคลชั่วคราวไปยังกระบวนการที่ร้องขอการล็อก

1
ฉันจะสลับตารางใน MySQL ได้อย่างไร
สมมติว่าฉันมีตารางfooซึ่งมีสถิติบางอย่างที่คำนวณได้ทุกตอนแล้ว มันถูกใช้อย่างหนักโดยการสอบถามอื่น ๆ นั่นเป็นเหตุผลที่ฉันต้องการคำนวณสถิติล่าสุดfoo_newและสลับเมื่อการคำนวณพร้อมใช้งาน ฉันทำได้ ALTER TABLE foo RENAME foo_tmp; ALTER TABLE foo_new RENAME foo; แต่สิ่งที่เกิดขึ้นถ้าการสอบถามความต้องการของตารางfooinbetween ทั้งสองสายเมื่อมีโต๊ะไม่foo? ฉันเดาว่าฉันต้องล็อคมันไว้ ... หรือจะมีวิธีอื่นอีกไหม?


5
ปัญหาการล็อคด้วย DELETE / INSERT พร้อมกันใน PostgreSQL
มันค่อนข้างง่าย แต่ฉันก็งงกับสิ่งที่ PG ทำ (v9.0) เราเริ่มต้นด้วยตารางง่ายๆ CREATE TABLE test (id INT PRIMARY KEY); และไม่กี่แถว: INSERT INTO TEST VALUES (1); INSERT INTO TEST VALUES (2); การใช้เครื่องมือสืบค้น JDBC ที่ฉันโปรดปราน (ExecuteQuery) ฉันเชื่อมต่อหน้าต่างสองเซสชันเข้ากับฐานข้อมูลที่ตารางนี้ใช้งานอยู่ ทั้งคู่เป็นธุรกรรม (เช่น auto-commit = false) ลองเรียกพวกมันว่า S1 และ S2 รหัสเดียวกันสำหรับแต่ละ: 1:DELETE FROM test WHERE id=1; 2:INSERT INTO test VALUES (1); 3:COMMIT; …

4
NOLOCK เลวเสมอหรือไม่
ฉันเป็นผู้พัฒนารายงานที่ต้องการทำให้ข้อความค้นหาของฉันมีประสิทธิภาพมากที่สุด ฉันเคยทำงานกับ DBA ที่บอกฉัน - ฉันเชื่อว่าเพราะฉันมักจะจัดการกับรายงานในเซิร์ฟเวอร์การผลิต - เพื่อใช้NOLOCKในทุกแบบสอบถาม ตอนนี้ฉันทำงานกับ DBA ที่ถูกแบนไม่NOLOCKว่ากรณีใด ๆ - แม้ว่ารายงานของฉัน (เนื่องจากการขาดดัชนีจำนวนมากในตารางสองสามตาราง) กำลังหยุดการจำลองแบบและการอัปเดตระบบ ในความคิดของฉันในกรณีนี้NOLOCKจะเป็นสิ่งที่ดี เนื่องจากการฝึกอบรม SQL ส่วนใหญ่ของฉันมาพร้อมกับ DBA ที่หลากหลายและมีความคิดเห็นที่แตกต่างกันมากฉันจึงอยากถามเรื่องนี้กับ DBA ที่หลากหลาย

3
การเพิ่มคอลัมน์ในตารางการผลิต
วิธีที่ดีที่สุดในการเพิ่มคอลัมน์ในตารางการผลิตขนาดใหญ่บน SQL Server 2008 R2 คืออะไร ตามหนังสือของ Microsoft ทางออนไลน์: การเปลี่ยนแปลงที่ระบุใน ALTER TABLE จะถูกนำไปใช้งานทันที หากการเปลี่ยนแปลงนั้นต้องการการแก้ไขแถวในตาราง ALTER TABLE จะอัพเดตแถว ALTER TABLE ได้รับ schema แก้ไขการล็อกบนตารางเพื่อให้แน่ใจว่าไม่มีการอ้างอิงการเชื่อมต่ออื่น ๆ แม้แต่ข้อมูลเมตาสำหรับตารางในระหว่างการเปลี่ยนแปลงยกเว้นการดำเนินการดัชนีออนไลน์ที่ต้องใช้การล็อค SCH-M ที่สั้นมากในตอนท้าย (http://msdn.microsoft.com/en-us/library/ms190273.aspx) บนโต๊ะขนาดใหญ่ที่มีแถวนับล้านแถวอาจใช้เวลาสักครู่ การดับเป็นตัวเลือกเดียวหรือไม่ วิธีที่ดีที่สุดในการจัดการกับสถานการณ์เช่นนี้คืออะไร?

3
การจัดการภาวะพร้อมกันเมื่อใช้รูปแบบ SELECT-UPDATE
สมมติว่าคุณมีรหัสต่อไปนี้ (โปรดอย่าสนใจว่ามันแย่มาก): BEGIN TRAN; DECLARE @id int SELECT @id = id + 1 FROM TableA; UPDATE TableA SET id = @id; --TableA must have only one row, apparently! COMMIT TRAN; -- @id is returned to the client or used somewhere else ในสายตาของฉันนี่ไม่ใช่การจัดการภาวะพร้อมกันอย่างเหมาะสม เพียงเพราะคุณมีการทำธุรกรรมไม่ได้หมายความว่าคนอื่นจะไม่อ่านค่าเดียวกันกับที่คุณทำก่อนที่คุณจะได้รับการปรับปรุงของคุณ ตอนนี้ปล่อยให้รหัสตามที่เป็นอยู่ (ฉันตระหนักดีว่านี่คือการจัดการที่ดีกว่าเป็นคำสั่งเดียวหรือดียิ่งขึ้นโดยใช้คอลัมน์ autoincrement / เอกลักษณ์) สิ่งที่แน่ใจว่าวิธีที่จะทำให้มันจัดการพร้อมกันอย่างถูกต้องและป้องกันเงื่อนไขการแข่งขัน ค่า …

3
ฉันจะยกเลิกคำขอล็อคแอพใน SQL Server ได้อย่างไร
กระบวนการsp_getapplock ที่เก็บไว้มีค่าส่งคืนต่อไปนี้: 0: การล็อกได้รับการอนุญาตให้สำเร็จพร้อมกัน 1: อนุญาตให้ล็อกสำเร็จหลังจากรอการล็อกอื่นที่เข้ากันไม่ได้ -1: คำขอล็อกหมดเวลา -2: คำขอล็อคถูกยกเลิก -3: คำขอล็อคถูกเลือกให้เป็นเหยื่อการหยุดชะงัก -999: ระบุการตรวจสอบความถูกต้องของพารามิเตอร์หรือข้อผิดพลาดการโทรอื่น ๆ ฉันกำลังเขียน wrapper สำหรับการโทรsp_getapplockใน data access layer ของเราและฉันต้องการทราบว่าภายใต้สถานการณ์ใด -2 ซึ่งสามารถส่งคืนได้เพื่อที่ฉันจะสามารถโยนข้อยกเว้นเชิงอธิบายและเป็นประโยชน์ เห็นได้ชัดว่าค่าส่งคืนของ -1 และ -3 หมายถึงอะไรและฉันสามารถสร้างเงื่อนไขการทดสอบที่ทำให้ค่าเหล่านั้นถูกส่งคืนได้อย่างง่ายดาย ฉันจะจัดการเพื่อรับค่าตอบแทนเป็น -2 ได้อย่างไร

6
ฉันสามารถอ่านค่า SQL Server Identity ตามลำดับได้หรือไม่?
TL: DR:คำถามด้านล่างนี้ลดลงเหลือ: เมื่อแทรกแถวจะมีหน้าต่างของโอกาสระหว่างการสร้างIdentityค่าใหม่และการล็อคกุญแจแถวที่สอดคล้องกันในดัชนีคลัสเตอร์ซึ่งผู้สังเกตการณ์ภายนอกจะเห็นที่ใหม่กว่า Identityมูลค่าแทรกโดยการทำธุรกรรมพร้อมกันหรือไม่ (ใน SQL Server) รุ่นโดยละเอียด ฉันมีตาราง SQL Server พร้อมIdentityคอลัมน์ที่เรียกว่าCheckpointSequenceซึ่งเป็นกุญแจสำคัญของดัชนีคลัสเตอร์ของตาราง (ซึ่งยังมีดัชนี nonclustered เพิ่มเติมอีกจำนวนหนึ่ง) แถวถูกแทรกเข้าไปในตารางโดยกระบวนการและเธรดพร้อมกันจำนวนมาก (ที่ระดับการแยกREAD COMMITTEDและไม่มีIDENTITY_INSERT) ในเวลาเดียวกันมีกระบวนการที่อ่านแถวจากดัชนีคลัสเตอร์เป็นระยะโดยเรียงลำดับตามCheckpointSequenceคอลัมน์นั้น(เช่นเดียวกับที่ระดับการแยกREAD COMMITTEDด้วยREAD COMMITTED SNAPSHOTตัวเลือกที่ถูกปิด) ขณะนี้ฉันพึ่งพาข้อเท็จจริงที่ว่ากระบวนการอ่านไม่สามารถ "ข้าม" จุดตรวจสอบได้ คำถามของฉันคือ: ฉันสามารถพึ่งพาอสังหาริมทรัพย์นี้ได้หรือไม่? และถ้าไม่ฉันจะทำอย่างไรเพื่อทำให้เป็นจริง ตัวอย่าง: เมื่อแทรกแถวที่มีค่าเอกลักษณ์ 1, 2, 3, 4 และ 5 ผู้อ่านจะต้องไม่เห็นแถวที่มีค่า 5 ก่อนที่จะเห็นแถวที่มีค่า 4 การทดสอบแสดงให้เห็นว่าแบบสอบถามซึ่งมีORDER BY CheckpointSequenceข้อ ( และWHERE CheckpointSequence > -1ประโยค) บล็อกได้อย่างน่าเชื่อถือเมื่อใดก็ตามที่ต้องอ่านแถว 4 …

3
แสดงให้เห็นถึงการไม่ใช้ (nolock) คำใบ้ในทุกแบบสอบถาม
คุณเคยต้องพิสูจน์ว่าไม่ได้ใช้คำใบ้แบบสอบถามหรือไม่? ฉันเห็นWITH (NOLOCK)ในทุกคำถามที่พบเซิร์ฟเวอร์ไม่ว่างมาก มันเป็นประเด็นที่นักพัฒนาคิดว่ามันควรจะเป็นโดยค่าเริ่มต้นเพราะพวกเขาเกลียดที่จะเห็นมันในโค้ดของพวกเขาหลายพันครั้ง ฉันพยายามอธิบายว่าการอนุญาตให้อ่านสกปรกและพวกเขาจะจบลงด้วยข้อมูลที่ไม่ดีในที่สุด แต่พวกเขาเชื่อว่าการแลกเปลี่ยนประสิทธิภาพนั้นคุ้มค่า (ฐานข้อมูลของพวกเขายุ่งเหยิงไม่น่าแปลกใจที่พวกเขามีปัญหาเรื่องประสิทธิภาพ) หากคุณมีตัวอย่างที่ชัดเจนเกี่ยวกับวิธีนำเสนอกรณีต่อต้านการใช้NOLOCKคำใบ้ในทางที่ผิดนี้จะได้รับการชื่นชม

6
จะทราบได้อย่างไรว่าตาราง Oracle ถูกล็อคหรือไม่?
เราใช้ซอฟต์แวร์ BI และฐานข้อมูลพื้นที่เก็บข้อมูลที่ติดตั้งใน Oracle Enterprise 11gR2 รายงานแบทช์บางส่วนจะพยายามเข้าถึงตารางฐานข้อมูลซึ่งอาจยังถูกล็อค ฉันจะทราบได้อย่างไรว่าตาราง Oracle ถูกล็อคหรือไม่ มีคำสั่ง SQL ที่แสดงเหมือนรายละเอียดประวัติเพื่อการวิเคราะห์หรือไม่?

6
ใน SQL Server มีวิธีการตรวจสอบว่ากลุ่มแถวที่เลือกถูกล็อคหรือไม่?
เราพยายามที่จะปรับปรุง / ลบบันทึกจำนวนมากในตารางแถวหลายพันล้าน เนื่องจากนี่เป็นตารางยอดนิยมจึงมีกิจกรรมมากมายในส่วนต่างๆของตารางนี้ กิจกรรมการอัปเดต / ลบขนาดใหญ่ใด ๆ จะถูกปิดกั้นเป็นระยะเวลานาน (เนื่องจากกำลังรอการล็อคในแถวหรือการล็อกหน้าหรือการล็อคตาราง) ทำให้หมดเวลาหรือใช้เวลาหลายวันเพื่อทำงานให้เสร็จ ดังนั้นเรากำลังเปลี่ยนวิธีการลบแถวเล็ก ๆ ในเวลาเดียวกัน แต่เราต้องการตรวจสอบว่าแถวที่เลือก (สมมติว่า 100 หรือ 1,000 หรือ 2,000 แถว) ปัจจุบันถูกล็อคโดยกระบวนการที่แตกต่างกันหรือไม่ ถ้าไม่เช่นนั้นดำเนินการลบ / อัปเดต หากพวกเขาถูกล็อคให้ย้ายไปยังกลุ่มระเบียนถัดไป ในตอนท้ายกลับมาที่จุดเริ่มต้นและพยายามอัปเดต / ลบสิ่งที่เหลือไว้ เป็นไปได้หรือไม่ ขอบคุณ ToC

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

2
การตรวจจับตารางหรือแถวที่ถูกล็อคใน SQL Server
ฉันกำลังพยายามทำความเข้าใจ / เรียนรู้วิธีติดตามรายละเอียดของเซสชันที่ถูกบล็อก ดังนั้นฉันจึงสร้างการตั้งค่าต่อไปนี้: create table foo (id integer not null primary key, some_data varchar(20)); insert into foo values (1, 'foo'); commit; ตอนนี้ฉันเชื่อมต่อกับฐานข้อมูลสองครั้งจากลูกค้าที่แตกต่างกันสองคน ปัญหาเซสชั่นแรก: begin transaction update foo set some_data = 'update' where id = 1; ฉันไม่ได้กระทำอย่างชัดเจนเพื่อรักษาล็อค ในเซสชั่นที่สองฉันออกคำสั่งเดียวกันและแน่นอนว่าหนึ่งรอเนื่องจากการล็อค ตอนนี้ฉันกำลังพยายามใช้คิวรี่ที่ต่างกันเพื่อดูว่าเซสชัน 2 กำลังรอfooตารางอยู่ sp_who2 แสดงต่อไปนี้ (ฉันลบบางคอลัมน์เพื่อแสดงเฉพาะข้อมูลสำคัญ): SPID | สถานะ | BlkBy | …

2
ล็อคสร้างตาราง
ในแอปพลิเคชันอื่นฉันรู้สึกประทับใจกับการออกแบบที่ไม่ดี: มีหลายเธรดที่รันEnsureDatabaseSchemaExists()เมธอดพร้อมกันซึ่งมีลักษณะดังนี้: IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN CREATE TABLE MyTable ( ... ); END อย่างไรก็ตามแม้ว่าจะดำเนินการในการทำธุรกรรม SERIALIZABLE รหัสนี้ดูเหมือนจะไม่ปลอดภัยต่อเธรด (เช่นรหัสขนานพยายามสร้างตารางหลายครั้ง) มีโอกาสที่จะบังคับให้คำสั่ง SELECT ได้รับการล็อกซึ่งป้องกันเธรดอื่นให้ทำคำสั่ง SELECT ที่เหมือนกันหรือไม่? มีรูปแบบที่ดีกว่าสำหรับวิธีการแบบมัลติเธรด -CheckSchemaExists () หรือไม่?

2
ใน SQL Server ล็อคการอ่านทำงานอย่างไร
สมมติว่าฉันมีคิวรีที่ใช้เวลานานต่อไปนี้ UPDATE [Table1] SET [Col1] = 'some value' WHERE [Col2] -- some clause which selects thousands of rows และสมมติว่ามีการดำเนินการค้นหาต่อไปนี้ขณะที่แบบสอบถามด้านบนทำงานอยู่ SELECT * FROM [Table1] แบบสอบถามแรกป้องกันไม่ให้แบบสอบถามที่สองทำงานจนกว่าแบบสอบถามแรกจะเสร็จสมบูรณ์หรือไม่ ถ้าใช่คิวรีแรกจะป้องกันไม่ให้คิวรีที่สองทำงานในแถวทั้งหมดหรือเฉพาะแถวที่เกี่ยวข้องในส่วนคำสั่ง WHERE หรือไม่ แก้ไข: สมมติว่าแบบสอบถามที่สองคือ SELECT [Col1], [Col2] FROM [Table1] WHERE [Col2] -- some clause whose matching elements overlap those from -- the clause in the …

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