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

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

3
เวลาแฝงของเครือข่ายที่เพิ่มขึ้นจะทำให้ตารางล็อคใน MS SQL Server หรือไม่
ถ้าฉันโทรไปยังฐานข้อมูล SQL Server เพียงครั้งเดียวผ่านเครือข่ายเวลาแฝงที่สูงตารางจะล็อกเกิดขึ้นเนื่องจากเวลาแฝงนั้นหรือไม่ สมมติว่าฉันสืบค้นตาราง A สำหรับระเบียนบางรายการและ SQL Server ต้องส่งคืนข้อมูลนั้นผ่านเครือข่ายที่ช้า - จะมีการล็อกการอ่านบนตาราง A ในขณะที่เซิร์ฟเวอร์ส่งการตอบสนองผ่านเครือข่ายหรือ SQL Server ปล่อยการล็อกก่อนส่ง การตอบสนอง? นอกจากนี้คำตอบจะแตกต่างกันไปตามขนาดของการตอบสนองหรือไม่? ถ้ามันต้องคืน KB สองสามเทียบกับหลายร้อย MB นั่นจะสร้างความแตกต่างได้หรือไม่? การสร้างธุรกรรมที่ชัดเจนการเรียกใช้คิวรีและการปิดธุรกรรมจะทำให้ตารางล็อคเนื่องจากเห็นได้ชัดว่าระยะเวลาของธุรกรรมมีความสัมพันธ์กับเวลาแฝงของฉัน

5
ความสัมพันธ์ที่แน่นอนระหว่างธุรกรรมฐานข้อมูลและการล็อกคืออะไร
นี่เป็นคำถามถ่อมใจที่ถามในวิญญาณของการเพิ่มความรู้ของฉัน; กรุณาอ่อนโยนในการตอบสนองของคุณ ในฐานะนักพัฒนาแอปพลิเคชั่นที่ใช้เวลานานฉันรู้ในระดับหนึ่งว่าธุรกรรมคืออะไร (ฉันใช้พวกเขาตลอดเวลา) ออกจากระดับการแยกธุรกรรมในขณะนี้ในระดับสูงธุรกรรมอนุญาตให้บล็อกการทำงานเสร็จสมบูรณ์ทั้งหมดหรือไม่เลยและอนุญาตให้มีการแยกจำนวนหนึ่งจากกิจกรรมการแก้ไขฐานข้อมูลอื่น ๆ ฉันยังรู้ว่า (ในฐานข้อมูลต่าง ๆ ) คืออะไรล็อคหรืออย่างน้อยหนึ่งวิธีการทำงาน (ถ้าฉันล็อคตารางในบางวิธีอย่างชัดเจนแล้วไม่มีกระบวนการหรือด้ายอื่น ๆ สามารถปรับปรุงอะไรเกี่ยวกับตารางที่) สิ่งที่ฉันมากที่สุดอย่างเห็นได้ชัดไม่ชัดเจนเกี่ยวกับการเป็นในฐานข้อมูลต่างๆเมื่อฉันอย่างชัดเจนล็อคแถวหรือตารางฉันกำลังจ้างโครงสร้างเดียวกันที่ใช้โดยฐานข้อมูลของสิ่งอำนวยความสะดวกการทำธุรกรรมภายใต้ครอบคลุมเพื่อให้การทำงานการทำธุรกรรมที่ถูกต้องหรือไม่ นั่นคือมันเกิดขึ้นกับฉันว่าเพื่อให้การทำธุรกรรมเป็นปรมาณูและโดดเดี่ยวนั้นจะต้องมีการล็อค การล็อคทรานแซคชั่นซ่อนเร้นจากทรานแซคชันนี้เป็นการล็อกแบบเดียวกับที่ฐานข้อมูลต่างๆให้ฉันเข้าถึงผ่านการสร้างเช่นSELECT FOR UPDATEหรือLOCKคำสั่งที่ชัดเจน? หรือแนวคิดทั้งสองนี้แตกต่างอย่างสิ้นเชิง? อีกครั้งฉันขอโทษสำหรับnaïvetéของคำถามนี้ ฉันมีความสุขที่จะชี้ไปที่แหล่งข้อมูลพื้นฐานเพิ่มเติม

2
วิธีค้นหาคิวรี่ที่ยังคงล็อคอยู่
การสืบค้นsys.dm_tran_locksDMV แสดงให้เราเห็นว่าเซสชันใด (SPIDs) กำลังล็อคทรัพยากรเช่นตารางหน้าและแถว สำหรับการล็อคแต่ละครั้งที่ได้มามีวิธีใดบ้างที่จะตัดสินว่าคำสั่ง SQL ใด (ลบ, แทรก, อัพเดตหรือเลือก) ทำให้เกิดการล็อคนั้น? ฉันรู้ว่าmost_recent_query_handleคอลัมน์ของsys.dm_exec_connectionsDMV ทำให้เรามีข้อความของการสืบค้นล่าสุดที่ดำเนินการ แต่หลายครั้งแบบสอบถามอื่น ๆ วิ่งมาก่อนภายใต้เซสชั่นเดียวกัน (SPID) และยังคงล็อค ฉันใช้sp_whoisactiveขั้นตอน (จาก Adam Machanic) แล้วและจะแสดงเฉพาะแบบสอบถามที่อยู่ในบัฟเฟอร์อินพุตในขณะนี้ (คิดว่าDBCC INPUTBUFFER @spid) ซึ่งไม่เสมอไป (และในกรณีของฉันมักจะไม่เคย) คือแบบสอบถามที่ได้รับการล็อค ตัวอย่างเช่น: เปิดธุรกรรม / เซสชัน ดำเนินการคำสั่ง (ที่ถือล็อคทรัพยากร) exec คำสั่งอื่นในเซสชั่นเดียวกัน เปิดธุรกรรม / เซสชันอื่นแล้วลองแก้ไขทรัพยากรที่ถูกล็อคในขั้นตอนที่ 2 sp_whoisactiveขั้นตอนจะชี้ให้เห็นคำสั่งในขั้นตอนที่ 3 ซึ่งไม่ได้เป็นผู้รับผิดชอบในการล็อคและจึงไม่เป็นประโยชน์ คำถามนี้มาจากการวิเคราะห์โดยใช้คุณสมบัติรายงานกระบวนการที่ถูกบล็อกเพื่อค้นหาสาเหตุของการบล็อกสถานการณ์ในการผลิต แต่ละธุรกรรมรันหลายเคียวรีและส่วนใหญ่ครั้งล่าสุด (ที่แสดงในอินพุตบัฟเฟอร์ที่ BPR) ไม่ค่อยถือล็อค ฉันมีคำถามติดตาม: …

2
ตารางคิว FIFO สำหรับพนักงานหลายคนใน SQL Server
ฉันพยายามตอบคำถาม stackoverflow ต่อไปนี้: ฉันควรใช้วิธีการล็อค SQL Server 2005/2008 แบบใดในการประมวลผลแถวของตารางแต่ละแถวในหลาย ๆ กรณีของแอพพลิเคชันเซิร์ฟเวอร์ หลังจากโพสต์คำตอบที่ไร้เดียงสาฉันคิดว่าฉันจะเอาเงินของฉันไปที่ปากของฉันและทดสอบสถานการณ์จริง ๆที่ฉันแนะนำเพื่อให้แน่ใจว่าฉันไม่ได้ส่ง OP ออกไปในการไล่ล่าห่านป่า มันกลายเป็นว่าหนักกว่าที่ฉันคิดไว้มาก (ไม่แปลกใจสำหรับทุกคนฉันแน่ใจ) นี่คือสิ่งที่ฉันได้ลองและคิดเกี่ยวกับ: ครั้งแรกที่ฉันพยายาม TOP 1 UPDATE กับ ORDER BY ROWLOCK, READPASTภายในตารางมาใช้ สิ่งนี้ทำให้เกิดการหยุดชะงักและยังประมวลผลรายการที่ผิดปกติ จะต้องใกล้เคียงกับ FIFO เท่าที่จะทำได้ยกเว้นข้อผิดพลาดที่ต้องพยายามประมวลผลแถวเดียวกันมากกว่าหนึ่งครั้ง ฉันก็พยายามเลือก QueueID ถัดไปต้องการลงในตัวแปรโดยใช้ชุดต่างๆของREADPAST, UPDLOCK, HOLDLOCKและROWLOCKเพื่อรักษาเฉพาะแถวสำหรับการปรับปรุงโดยเซสชั่นที่ รูปแบบทั้งหมดที่ฉันลองใช้นั้นประสบปัญหาเดียวกันกับที่เคยมีมาก่อนและสำหรับการรวมกันบางอย่างกับREADPAST: คุณสามารถระบุล็อค READPAST ในระดับการแยก READ COMMITTED หรือ REPEATABLE READ สิ่งนี้ทำให้เกิดความสับสนเพราะเป็นข้อผูกมัดที่ต้องอ่าน ฉันเคยพบเจอสิ่งนี้มาก่อนและมันน่าหงุดหงิด ตั้งแต่ฉันเริ่มเขียนคำถามนี้ Remus Rusani โพสต์คำตอบใหม่สำหรับคำถาม …

2
INSERTs ขนาดใหญ่ปิดกั้นการเลือก
ฉันมีปัญหากับ INSERT จำนวนมากที่บล็อกการดำเนินการ SELECT ของฉัน schema ฉันมีโต๊ะแบบนี้: CREATE TABLE [InverterData]( [InverterID] [bigint] NOT NULL, [TimeStamp] [datetime] NOT NULL, [ValueA] [decimal](18, 2) NULL, [ValueB] [decimal](18, 2) NULL CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED ( [TimeStamp] DESC, [InverterID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = …

1
เมื่อเปลี่ยนขนาดของคอลัมน์ nvarchar ฉันจำเป็นต้องทำดัชนีที่ไม่ซ้ำหรือไม่? และตารางจะถูกล็อคเมื่อสร้างดัชนีใหม่หรือไม่
ในฐานข้อมูลของเรามีตารางขนาดใหญ่ที่มีลักษณะคล้ายกันมากขึ้นหรือน้อยลง: CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); แต่ตอนนี้ขนาดของเขตข้อมูลอนุกรมกลายเป็นต่ำดังนั้นฉันต้องการเปลี่ยนเป็น 32 schema Visual Studio เปรียบเทียบเครื่องมือแนะนำการทำเช่นนี้โดย: DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); มันจำเป็นจริงๆหรือ? หรือมากกว่านั้นเป็นวิธีที่ประหยัดมากในการทำเช่นนี้? เมื่อสร้างดัชนีที่ไม่ซ้ำอีกครั้งตารางของฉันจะถูกล็อคหรือไม่ เพราะนี่จะเป็นปัญหาใหญ่ (เนื่องจากตารางมี 30 …

2
แบบสอบถามแบบเลือกอย่างง่ายได้รับการล็อกหรือไม่
ฉันใหม่มากกับ SQL Server และต้องการที่จะเข้าใจว่าต่อไปนี้selectคำสั่งที่ง่ายมากที่จะล็อคใด ๆ Select * from Student; โปรดพิจารณากรณีที่คำสั่งจะไม่ทำงานภายในbegin tranบล็อก

1
ทำไม RX-X lock นี้ไม่ปรากฏใน Extended Events?
ปัญหา ฉันมีคู่ของคำสั่งที่ทำให้เกิดการล็อค RX-X อย่างไรก็ตามเมื่อฉันใช้ Extended Events เพื่อดูการได้มาของการล็อคการได้รับ RX-X lock ไม่เคยปรากฏขึ้นมันจะออกมาเท่านั้น มันมาจากไหน? Repro นี่คือตารางของฉัน: CREATE TABLE dbo.LockTest ( ID int identity, Junk char(4) ) CREATE CLUSTERED INDEX CX_LockTest --not unique! ON dbo.LockTest(ID) --preload some rows INSERT dbo.LockTest VALUES ('data'),('data'),('data') นี่คือชุดปัญหาของฉัน: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRAN INSERT dbo.LockTest VALUES ('bleh') …

2
วิธีรับการแทรก SQL และ / หรือการปรับปรุงเพื่อไม่ล็อคทั้งตารางใน MS SQL Server
มือใหม่ในฐานข้อมูลทำงานมากดังนั้นขอขอบคุณที่กรุณาอดทนรอด้วยคำถามพื้นฐาน ฉันใช้ 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(); …

4
การล็อกแถว InnoDB - วิธีการนำไปใช้
ตอนนี้ฉันได้ดูรอบ ๆ แล้วอ่านไซต์ mysql และฉันก็ยังไม่เห็นว่ามันทำงานอย่างไร ฉันต้องการเลือกและล็อกแถวผลลัพธ์สำหรับการเขียนเขียนการเปลี่ยนแปลงและปลดล็อค เปิดใช้งาน audocommit โครงการ id (int) name (varchar50) status (enum 'pending', 'working', 'complete') created (datetime) updated (datetime) เลือกรายการที่มีสถานะรอดำเนินการและอัปเดตให้ใช้งานได้ ใช้การเขียนแบบเอกสิทธิ์เฉพาะบุคคลเพื่อให้แน่ใจว่ารายการเดียวกันไม่ได้รับสองครั้ง ดังนั้น; "SELECT id FROM `items` WHERE `status`='pending' LIMIT 1 FOR WRITE" รับ ID จากผลลัพธ์ "UPDATE `items` SET `status`='working', `updated`=NOW() WHERE `id`=<selected id> ฉันต้องทำอะไรเพื่อปลดล็อคและทำงานเหมือนที่ฉันเคยทำด้านบนหรือไม่?
13 mysql  innodb  locking 


1
ทำไม UPDLOCK ทำให้ SELECT เลือกที่จะหยุด (ล็อค)?
ฉันมีตัวเลือกใน SQL Server ที่ล็อคทั้งตาราง นี่คือสคริปต์การตั้งค่า (ตรวจสอบให้แน่ใจว่าคุณไม่ได้เขียนทับอะไรเลย) USE [master] GO IF EXISTS(SELECT 1 FROM sys.databases d WHERE d.name = 'LockingTestDB') DROP DATABASE LockingTestDB GO CREATE DATABASE LockingTestDB GO USE [LockingTestDB] GO IF EXISTS(SELECT 1 FROM sys.tables t WHERE t.name = 'LockingTestTable') DROP TABLE LockingTestTable GO CREATE TABLE LockingTestTable ( Id int …

2
การอัพเดตดัชนีเซิร์ฟเวอร์ SQL หยุดชะงัก
ฉันมี 2 แบบสอบถามซึ่งเมื่อทำงานในเวลาเดียวกันจะทำให้เกิดการหยุดชะงัก แบบสอบถาม 1 - อัปเดตคอลัมน์ซึ่งรวมอยู่ในดัชนี (ดัชนี 1): update table1 set column1 = value1 where id = @Id ใช้ X-Lock บน table1 จากนั้นลอง X-Lock บน index1 แบบสอบถาม 2: select columnx, columny, etc from table1 where {some condition} นำ S-Lock ไปที่ index1 จากนั้นลอง S-Lock บน table1 มีวิธีการป้องกันการหยุดชะงักในขณะที่รักษาข้อความค้นหาเดียวกันหรือไม่ ตัวอย่างเช่นฉันสามารถใช้ X-Lock ในดัชนีในธุรกรรมการปรับปรุงก่อนการปรับปรุงเพื่อให้แน่ใจว่าการเข้าถึงตารางและดัชนีอยู่ในลำดับเดียวกัน …

1
การหยุดชะงักเมื่ออัพเดตแถวต่าง ๆ ด้วยดัชนีที่ไม่ทำคลัสเตอร์
ฉันกำลังแก้ไขปัญหาการหยุดชะงักในขณะที่ฉันสังเกตเห็นว่าพฤติกรรมการล็อคแตกต่างกันเมื่อฉันใช้ดัชนีแบบคลัสเตอร์และแบบไม่รวมกลุ่มบนฟิลด์รหัส ปัญหาการหยุดชะงักดูเหมือนว่าจะได้รับการแก้ไขหากดัชนีหรือคีย์หลักที่ถูก clusted ถูกนำไปใช้กับฟิลด์ id ฉันมีการทำธุรกรรมที่แตกต่างกันที่ทำการอัปเดตแถวที่แตกต่างกันอย่างน้อยหนึ่งรายการเช่นธุรกรรม A จะอัปเดตแถวที่มี ID = a เท่านั้น tx B จะแตะแถวที่มี ID = b เท่านั้น และฉันเข้าใจดีว่าหากไม่มีดัชนีการอัปเดตจะได้รับการอัพเดตการล็อคสำหรับแถวทั้งหมดและแปลงเป็นล็อคแบบเอกสิทธิ์เฉพาะบุคคลเมื่อจำเป็นซึ่งในที่สุดจะนำไปสู่การหยุดชะงัก แต่ฉันล้มเหลวในการค้นหาสาเหตุที่มีดัชนีที่ไม่ใช่คลัสเตอร์การหยุดชะงักยังคงอยู่ที่นั่น (แม้ว่าอัตราการเข้าชมดูเหมือนจะลดลง) ตารางข้อมูล: CREATE TABLE [dbo].[user]( [id] [int] IDENTITY(1,1) NOT NULL, [userName] [nvarchar](255) NULL, [name] [nvarchar](255) NULL, [phone] [nvarchar](255) NULL, [password] [nvarchar](255) NULL, [ip] [nvarchar](30) NULL, [email] [nvarchar](255) NULL, [pubDate] …

2
วิธีการใช้ล็อคในแง่ดีอย่างถูกต้องใน MySQL
หนึ่งจะใช้ล็อคในแง่ดีอย่างถูกต้องใน MySQL ได้อย่างไร ทีมของเราได้อนุมานว่าเราต้องทำ # 4 ด้านล่างมิฉะนั้นอาจมีความเสี่ยงที่เธรดอื่นสามารถอัปเดตบันทึกรุ่นเดียวกัน แต่เราต้องการตรวจสอบว่านี่เป็นวิธีที่ดีที่สุด สร้างเขตข้อมูลเวอร์ชันบนตารางที่คุณต้องการใช้การล็อคในแง่ดีสำหรับคอลัมน์ชื่อ = "รุ่น" เมื่อเลือกตรวจสอบให้แน่ใจว่าได้รวมคอลัมน์รุ่นแล้วจดบันทึกเวอร์ชัน ในการอัปเดตครั้งต่อ ๆ ไปคำสั่งการอัปเดตควรออก "โดยที่ version = X" โดยที่ X คือรุ่นที่เราได้รับใน # 2 และตั้งค่าฟิลด์เวอร์ชันระหว่างคำสั่งการอัปเดตนั้นเป็น X + 1 ดำเนินการSELECT FOR UPDATEเกี่ยวกับบันทึกที่เรากำลังจะอัปเดตเพื่อให้เราเป็นอันดับที่สามารถเปลี่ยนแปลงบันทึกที่เรากำลังพยายามที่จะปรับปรุง เพื่อชี้แจงเราพยายามป้องกันสองเธรดที่เลือกเร็กคอร์ดเดียวกันในหน้าต่างเวลาเดียวกันที่พวกเขาคว้าเร็กคอร์ดเวอร์ชันเดียวกันจากการเขียนทับกันถ้าพวกเขาพยายามและอัพเดตเร็กคอร์ดในเวลาเดียวกัน เราเชื่อว่าหากเราไม่ทำ # 4 มีโอกาสที่ถ้าทั้งสองเธรดป้อนธุรกรรมของตนในเวลาเดียวกัน (แต่ยังไม่ได้ออกการอัปเดต) เมื่อพวกเขาไปอัปเดตเธรดที่สองที่จะใช้ UPDATE ... โดยที่ version = X จะทำงานกับข้อมูลเก่า เราคิดถูกต้องหรือไม่ว่าเราต้องทำการล็อกในแง่ร้ายเมื่อทำการอัพเดตแม้ว่าเราจะใช้ฟิลด์เวอร์ชั่น / การล็อคในแง่ดี
13 mysql  locking 

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