หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
นําไปใช้กับ:✅ จุดสิ้นสุดการวิเคราะห์ SQL และ Warehouse ใน Microsoft Fabric
คล้ายกับลักษณะการทํางานของพวกเขาใน SQL Server ธุรกรรมช่วยให้คุณสามารถควบคุมการยอมรับหรือย้อนกลับของคิวรีที่อ่านและเขียนได้
Fabric Data Warehouse รองรับธุรกรรมที่สอดคล้องกับ ACID ธุรกรรมแต่ละรายการเป็นแบบอะตอม สอดคล้องกัน แยกได้ และทนทาน (ACID) การดําเนินการทั้งหมดภายในธุรกรรมเดียวจะได้รับการปฏิบัติแบบอะตอม ทั้งหมดสําเร็จหรือล้มเหลวทั้งหมด ถ้าใบแจ้งยอดใด ๆ ในธุรกรรมล้มเหลว ธุรกรรมทั้งหมดจะถูกย้อนกลับ
ธุรกรรมที่ชัดเจน
คุณสามารถปรับเปลี่ยนข้อมูลที่เก็บไว้ในตารางในคลังสินค้าโดยใช้ธุรกรรมที่ชัดเจนเพื่อจัดกลุ่มการเปลี่ยนแปลงเข้าด้วยกัน
ตัวอย่างเช่น คุณสามารถทําการแทรกไปยังหลายตาราง หรือไม่มีตารางใดถ้ามีข้อผิดพลาดเกิดขึ้น ถ้าคุณกําลังเปลี่ยนรายละเอียดเกี่ยวกับใบสั่งซื้อที่มีผลต่อสามตาราง คุณสามารถจัดกลุ่มการเปลี่ยนแปลงเหล่านั้นลงในธุรกรรมเดียวได้ ซึ่งหมายความว่าเมื่อมีการคิวรีตารางเหล่านั้น ตารางทั้งหมดจะมีการเปลี่ยนแปลงหรือไม่สามารถทําได้ ธุรกรรมเป็นแนวทางปฏิบัติทั่วไปสําหรับเมื่อคุณต้องการตรวจสอบให้แน่ใจว่าข้อมูลของคุณมีความสอดคล้องกันในหลายตาราง
คุณสามารถใช้กลไกการควบคุมไวยากรณ์ T-SQL (BEGIN TRAN, COMMIT TRAN, และ ROLLBACK TRAN) มาตรฐานสําหรับธุรกรรมที่ชัดเจน สําหรับข้อมูลเพิ่มเติม ให้ดูที่:- เริ่ม
- ธุรกรรมการย้อนกลับธุรกรรม
- COMMIT
สนับสนุนทรานแซคชันแบบสอบถามข้ามฐานข้อมูล
คลังสินค้าใน Microsoft Fabric สนับสนุนธุรกรรมที่ครอบคลุมทั่วทั้งคลังสินค้าที่อยู่ภายในพื้นที่ทํางานเดียวกัน รวมถึงการอ่านจากจุดสิ้นสุดการวิเคราะห์ SQL ของ Lakehouse สําหรับตัวอย่าง โปรดดู การเขียนแบบสอบถาม SQL ข้ามฐานข้อมูล
ทําความเข้าใจการล็อกและการบล็อกใน Fabric Data Warehouse
Fabric Data Warehouse ใช้การล็อกระดับตาราง ไม่ว่าคิวรีจะสัมผัสกับแถวเดียวหรือหลายแถว ตารางต่อไปนี้แสดงรายการของล็อคที่ใช้สําหรับการดําเนินการ T-SQL ที่แตกต่างกัน
| ชนิดคําสั่ง | ล็อคแล้ว |
|---|---|
| ดีเอ็มแอล | |
| เลือก | Schema-Stability (Sch-S) |
| สอด | เจตนาพิเศษ (IX) |
| ลบ | เจตนาพิเศษ (IX) |
| อัพเดต | เจตนาพิเศษ (IX) |
| ควบ | เจตนาพิเศษ (IX) |
| คัดลอกไปยัง | เจตนาพิเศษ (IX) |
| ดีดีแอล | |
| สร้างตาราง | Schema-Modification (Sch-M) |
| เปลี่ยนตาราง | Schema-Modification (Sch-M) |
| วางโต๊ะ | Schema-Modification (Sch-M) |
| ตารางตัดแต่ง | Schema-Modification (Sch-M) |
| สร้างตารางเป็นเลือก | Schema-Modification (Sch-M) |
| สร้างตารางเป็นโคลนของ | Schema-Modification (Sch-M) |
คุณสามารถคิวรีล็อกที่เก็บไว้ใน sys.dm_tran_locks มุมมองการจัดการแบบไดนามิก (DMV) ในขณะนี้
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการล็อก การเลื่อนระดับการล็อก และความเข้ากันได้ของล็อก ให้ดูที่ คู่มือการล็อกธุรกรรมและการกําหนดเวอร์ชันแถว
การแยกสแนปช็อต
Fabric Data Warehouse บังคับใช้การแยกสแนปช็อตในธุรกรรมทั้งหมด การแยกสแนปช็อตเป็นระดับการแยกตามแถวที่ให้ความสอดคล้องระดับธุรกรรมสําหรับข้อมูล และใช้เวอร์ชันแถวที่จัดเก็บไว้เพื่อ tempdb เลือกแถวที่จะอัปเดต ธุรกรรมใช้รุ่นแถวข้อมูลที่มีอยู่เมื่อธุรกรรมเริ่มต้น สิ่งนี้ทําให้มั่นใจได้ว่าแต่ละธุรกรรมจะทํางานบนสแนปช็อตที่สอดคล้องกันของข้อมูลตามที่มีอยู่ในตอนเริ่มต้นของธุรกรรม
ในการแยกสแนปช็อต คิวรีในธุรกรรมจะเห็นเวอร์ชันเดียวกัน หรือสแนปช็อต ตามสถานะของฐานข้อมูลเมื่อธุรกรรมเริ่มต้น ในการแยกสแนปช็อต ธุรกรรมที่ปรับเปลี่ยนข้อมูลจะไม่บล็อกธุรกรรมที่อ่านข้อมูล และธุรกรรมที่อ่านข้อมูลจะไม่บล็อกธุรกรรมที่เขียนข้อมูล พฤติกรรมการมองโลกในแง่ดีและไม่ปิดกั้นนี้ยังช่วยลดโอกาสที่จะเกิดการชะงักงันสําหรับธุรกรรมที่ซับซ้อนได้อย่างมาก
ถ้าคุณใช้ T-SQL เพื่อเปลี่ยนระดับการแยก การเปลี่ยนแปลงจะถูกละเว้นในเวลาที่ดําเนินการคิวรี และจะใช้การแยกสแนปช็อต
ในการแยกสแนปช็อต อาจมีข้อขัดแย้งในการเขียน-เขียน หรืออัปเดต สําหรับข้อมูลเพิ่มเติม โปรดดู ทําความเข้าใจข้อขัดแย้งในการเขียน-เขียนใน Fabric Data Warehouse
ล็อคสคีมา
การล็อก Schema ป้องกันความขัดแย้งในคําสั่ง DDL เช่น Schema ของตารางมีการเปลี่ยนแปลงในขณะที่แถวกําลังได้รับการอัปเดตในธุรกรรม โปรดทราบว่าการดําเนินการ DDL เช่น การเปลี่ยนแปลง Schema และการย้ายข้อมูล สามารถบล็อกหรือถูกบล็อกโดยปริมาณงานการอ่านที่ใช้งานอยู่
- ในระหว่างการดําเนินการภาษานิยามข้อมูล (DDL) กลไกจัดการฐานข้อมูลจะใช้การล็อกการแก้ไข schema (
Sch-M) ในช่วงเวลาที่ถือSch-Mไว้ ล็อคจะป้องกันการเข้าถึงโต๊ะพร้อมกันทั้งหมดจนกว่าจะปลดล็อค - ในระหว่างการดําเนินการภาษาการจัดการข้อมูล (DML) กลไกจัดการฐานข้อมูลจะใช้การล็อกความเสถียรของสคีมา (
Sch-S) การดําเนินการที่ได้รับการSch-Mล็อคจะถูกบล็อกโดยSch-Sล็อค ธุรกรรมอื่นๆ ยังคงทํางานต่อไปในขณะที่กําลังคอมไพล์แบบสอบถาม แต่การดําเนินการ DDL จะถูกบล็อกจนกว่าจะสามารถเข้าถึง Schema ได้ - การดําเนินการ DDL ยังได้รับการล็อก (
X) พิเศษบนแถวในมุมมองระบบ เช่นsys.tablesและsys.objectsเชื่อมโยงกับตารางเป้าหมาย ตลอดระยะเวลาของธุรกรรม สิ่งนี้จะบล็อกคําสั่งพร้อมกันSELECTบนsys.tablesและsys.objects
แนวทางปฏิบัติแนะนําเพื่อหลีกเลี่ยงการบล็อก
- หลีกเลี่ยงการทําธุรกรรมที่ดําเนินไปเป็นเวลานาน หรือจัดกําหนดการในช่วงเวลาที่มีกิจกรรมพร้อมกันต่ําหรือไม่มีเลย
- กําหนดเวลาการดําเนินการ DDL เฉพาะในช่วงระยะเวลาการบํารุงรักษาเพื่อลดการบล็อก
- หลีกเลี่ยงการวางคําสั่ง DDL ภายในธุรกรรมของผู้ใช้ที่ชัดเจน (
BEGIN TRAN) ธุรกรรมที่ทํางานเป็นเวลานานซึ่งแก้ไขตารางอาจทําให้เกิดปัญหาการบล็อกสําหรับการดําเนินการและSELECTแบบสอบถาม DML อื่นๆ ทั้งบนตารางผู้ใช้และมุมมองแค็ตตาล็อกระบบ เช่นsys.tables. เมื่อต้องการตรวจสอบและแก้ไขปัญหาความขัดแย้งในการล็อกที่อาจเกิดขึ้น ให้ใช้sys.dm_tran_locks - ตรวจสอบการล็อกและความขัดแย้งในคลังสินค้า
- ใช้ sys.dm_tran_locks เพื่อตรวจสอบล็อคปัจจุบัน
- Fabric Data Warehouse สนับสนุนคําสั่ง DDL บางอย่างภายในธุรกรรมที่ผู้ใช้กําหนด แต่ไม่แนะนําในธุรกรรมที่ทํางานเป็นเวลานาน ภายในธุรกรรม คําสั่ง DDL สามารถบล็อกธุรกรรมที่เกิดขึ้นพร้อมกันหรือทําให้เกิดความขัดแย้งในการเขียน-เขียน
ทําความเข้าใจข้อขัดแย้งในการเขียน-เขียนใน Fabric Data Warehouse
ความขัดแย้งในการเขียน-เขียนอาจเกิดขึ้นได้เมื่อธุรกรรมสองรายการพยายาม UPDATE, DELETE, MERGE, หรือ TRUNCATE ตารางเดียวกัน
ข้อขัดแย้งในการเขียน-เขียนหรือข้อขัดแย้งในการอัปเดตเป็นไปได้ที่ระดับตาราง เนื่องจาก Fabric Data Warehouse ใช้การล็อกระดับตาราง ถ้าธุรกรรมสองรายการพยายามปรับเปลี่ยนแถวที่ต่างกันในตารางเดียวกัน ธุรกรรมเหล่านั้นยังคงสามารถขัดแย้งกันได้
ความขัดแย้งในการเขียน-เขียนส่วนใหญ่เกิดขึ้นจากสองสถานการณ์:
- ความขัดแย้งของปริมาณงานที่เกิดจากผู้ใช้
- ผู้ใช้หรือกระบวนการหลายคนปรับเปลี่ยนตารางเดียวกันพร้อมกัน
- อาจเกิดขึ้นในไปป์ไลน์ ETL การอัปเดตชุดงาน หรือธุรกรรมที่ทับซ้อนกัน
- ความขัดแย้งที่เกิดจากระบบ
- งานระบบพื้นหลัง เช่น การบดอัดข้อมูลอัตโนมัติ เขียนไฟล์ใหม่ที่มีคุณภาพต่ํา
- สิ่งเหล่านี้อาจขัดแย้งกับธุรกรรมของผู้ใช้ แม้ว่าการ บดอัดข้อมูลล่วงหน้า จะป้องกันความขัดแย้งในการเขียน-เขียนชนิดนี้อย่างแข็งขัน
หากเกิดข้อขัดแย้งระหว่างการเขียนและเขียน คุณอาจเห็นข้อความแสดงข้อผิดพลาด เช่น
- ข้อผิดพลาด 24556: ธุรกรรมการแยกสแนปช็อตถูกยกเลิกเนื่องจากความขัดแย้งในการปรับปรุง การใช้การแยกสแนปช็อตเพื่อเข้าถึงตาราง '%.*ls' โดยตรงหรือโดยอ้อมในฐานข้อมูล '%.*ls' อาจทําให้เกิดข้อขัดแย้งในการอัปเดตหากแถวในตารางนั้นถูกลบหรือปรับปรุงโดยธุรกรรมที่เกิดขึ้นพร้อมกันอื่น ลองทําธุรกรรมอีกครั้ง
- ข้อผิดพลาด 24706: ธุรกรรมการแยกสแนปช็อตถูกยกเลิกเนื่องจากความขัดแย้งในการปรับปรุง คุณไม่สามารถใช้การแยกสแน็ปช็อตเพื่อเข้าถึงตาราง '%.*ls' โดยตรงหรือโดยอ้อมในฐานข้อมูล '%.*ls' เพื่อปรับปรุง ลบ หรือแทรกแถวที่ถูกแก้ไขหรือลบโดยธุรกรรมอื่น โปรดลองทําธุรกรรมอีกครั้ง
หากคุณพบข้อความแสดงข้อผิดพลาดเหล่านี้ แสดงว่าธุรกรรมอย่างน้อยหนึ่งรายการสําเร็จ และธุรกรรมที่ขัดแย้งกันอย่างน้อยหนึ่งรายการล้มเหลว ลองทําธุรกรรมที่ล้มเหลวอีกครั้ง
Note
แม้ว่า MERGE ธุรกรรมจะส่งผลให้เกิดการเปลี่ยนแปลงแบบผนวกเท่านั้น แต่ก็ยังคงสร้างข้อขัดแย้งในการเขียน-เขียน เมื่อ MERGE ธุรกรรมมีผลต่อแถวที่แตกต่างจากธุรกรรม DML ที่เกิดขึ้นพร้อมกันอื่น ๆ อาจพบข้อผิดพลาดนี้หาก MERGE ไม่ใช่ธุรกรรมแรกที่ยอมรับ: 'ธุรกรรมการแยกสแนปช็อตถูกยกเลิกเนื่องจากความขัดแย้งในการอัปเดต'
แนวทางปฏิบัติที่ดีที่สุดในการหลีกเลี่ยงความขัดแย้งระหว่างการเขียนและการเขียน
วิธีหลีกเลี่ยงความขัดแย้งระหว่างการเขียนและเขียน
- หลีกเลี่ยงการ
UPDATEดําเนินการ ,DELETE, พร้อมกันMERGEบนตารางเดียวกัน- ให้ความสนใจอย่างระมัดระวังกับ
UPDATEการดําเนินการDELETEMERGEภายในธุรกรรมหลายขั้นตอน
- ให้ความสนใจอย่างระมัดระวังกับ
- ใช้ตรรกะลองใหม่ในแอปพลิเคชันและคิวรีทั้งหมด
- ใช้ตรรกะการลองใหม่ในกระบวนงานที่เก็บไว้และไปป์ไลน์ ETL
- เพิ่มตรรกะการลองใหม่ที่มีความล่าช้าในไปป์ไลน์หรือแอปเพื่อจัดการกับข้อขัดแย้งชั่วคราว
- ใช้การแบ็คออฟแบบเอ็กซ์โพเนนเชียลเพื่อหลีกเลี่ยงพายุลองใหม่ที่ทําให้การหยุดชะงักของเครือข่ายชั่วคราวแย่ลง สําหรับข้อมูลเพิ่มเติม โปรดดู รูปแบบการลองใหม่
- ข้อขัดแย้งในการเขียน-เขียนกับบริการการบดอัดข้อมูลเบื้องหลังของ Fabric Data Warehouse เป็นไปได้ แต่โดยทั่วไปจะถูกป้องกันโดยคุณลักษณะ การบดอัดข้อมูลล่วงหน้า
การบล็อกตะไบโต๊ะและไม้ปาร์เก้
ข้อขัดแย้งจากธุรกรรมที่เกิดขึ้นพร้อมกันสองรายการขึ้นไปซึ่งอัพเดตแถวในตารางอย่างน้อยหนึ่งแถวจะถูกประเมินเมื่อสิ้นสุดธุรกรรม ธุรกรรมแรกที่จะดําเนินการเสร็จสมบูรณ์ และธุรกรรมอื่นๆ จะถูกย้อนกลับโดยมีข้อผิดพลาดที่ส่งกลับ ข้อขัดแย้งเหล่านี้จะถูกประเมินในระดับตารางและไม่ใช่ระดับไฟล์ parquet แต่ละรายการ
คําสั่ง INSERT จะสร้างไฟล์ parquet ใหม่เสมอ ซึ่งหมายความว่าความขัดแย้งกับธุรกรรมอื่นน้อยลง ยกเว้น DDL เนื่องจากอาจเปลี่ยนแปลง Schema ของตาราง
ข้อจำกัด
- ไม่รองรับธุรกรรมแบบกระจาย เช่น
BEGIN DISTRIBUTED TRANSACTION. -
ALTER TABLEไม่ได้รับการสนับสนุนภายในธุรกรรมที่ชัดเจน - ไม่สนับสนุนจุดบันทึก
- ไม่สนับสนุนธุรกรรมที่มีชื่อ
- ธุรกรรมที่ทําเครื่องหมายไม่ได้รับการสนับสนุน
- ในขณะนี้ มีฟังก์ชัน T-SQL แบบจํากัดในคลังสินค้า ดู พื้นที่ผิว T-SQL ใน Fabric Data Warehouse สําหรับรายการคําสั่ง T-SQL ที่ไม่พร้อมใช้งานในขณะนี้
- ถ้าทรานแซคชันมีการแทรกข้อมูลลงในตารางที่ว่างเปล่าและออก SELECT ก่อนย้อนกลับ สถิติที่สร้างขึ้นโดยอัตโนมัติจะยังคงแสดงข้อมูลที่ไม่ได้ผูกมัด ซึ่งก่อให้เกิดสถิติที่ไม่ถูกต้อง สถิติที่ไม่ถูกต้องอาจนําไปสู่แผนคิวรีที่ไม่ได้เปลี่ยนแปลงและเวลาการดําเนินการ ถ้าคุณย้อนกลับธุรกรรมด้วย SELECTs หลังจากการแทรกขนาดใหญ่ อัปเดต สถิติ สําหรับคอลัมน์ที่ระบุใน SELECT ของคุณ