3.1 การเกิดกรด
ตัวย่อ ACID ปรากฏ ครั้งแรกในปี 1983 ในบทความของ Theo Haerder และ Andreas Reuter เพื่อให้ข้อความง่ายขึ้นและทำให้น่าเชื่อถือมากขึ้น ฉันจะแปลส่วนหนึ่งของบทความนี้ (โดยลดขนาดลงเล็กน้อย) ข้อมูลโค้ดนี้ใช้ตัวอย่างธุรกรรมธนาคารที่มีการโอนเงินจากบัญชีหนึ่งไปยังอีกบัญชีหนึ่ง
แนวคิดของการทำธุรกรรมซึ่งในตัวอย่างรวมถึงการโต้ตอบทั้งหมดกับฐานข้อมูลระหว่าง$BEGIN_TRANSACTION
และ$COMMIT_TRANSACTION
กำหนดให้การดำเนินการทั้งหมดดำเนินการแยกกันไม่ได้: การดำเนินการทั้งหมดจะสะท้อนให้เห็นอย่างถูกต้องในสถานะของฐานข้อมูล หรือไม่มีอะไรเกิดขึ้น หาก ณ จุดใดเวลาหนึ่งก่อนที่จะเข้าถึง$COMMIT_TRANSACTION
ผู้ใช้ป้อนคำสั่งERROR
ที่มี การ$RESTORE_TRANSACTION
เปลี่ยนแปลงจะไม่สะท้อนให้เห็นในฐานข้อมูล
เพื่อให้บรรลุถึงการแบ่งแยกไม่ได้ ธุรกรรมต้องมีคุณสมบัติสี่ประการต่อไปนี้:
ปรมาณู (ปรมาณู). ธุรกรรมต้องเป็นประเภททั้งหมดหรือไม่มีเลยตามที่อธิบายไว้ข้างต้น และไม่ว่าจะเกิดอะไรขึ้น ผู้ใช้ต้องรู้ว่าธุรกรรมอยู่ในสถานะใด
ความสอดคล้อง (ความสอดคล้อง). ธุรกรรมที่ถึงจุดสิ้นสุดตามปกติของธุรกรรม (EOT) และด้วยเหตุนี้จึงยอมรับผลลัพธ์ที่รักษาความสอดคล้องของฐานข้อมูล กล่าวอีกนัยหนึ่ง ธุรกรรมที่สำเร็จทุกรายการตามคำนิยาม ให้ผลลัพธ์ที่ถูกต้องเท่านั้น เงื่อนไขนี้จำเป็นต่อการรองรับคุณสมบัติที่สี่ - ความทนทาน
ความโดดเดี่ยว (การแยก). เหตุการณ์ที่เกิดขึ้นภายในธุรกรรมต้องถูกซ่อนไว้จากธุรกรรมอื่นๆ ที่กำลังดำเนินการพร้อมกัน หากไม่เป็นไปตามเงื่อนไขนี้ ด้วยเหตุผลดังกล่าวข้างต้น ธุรกรรมจะไม่สามารถกลับสู่จุดเริ่มต้นได้ เพื่อให้ได้การแยกจะใช้วิธีการที่เรียกว่าการซิงโครไนซ์ ...
ความทนทาน (ความทนทาน). เมื่อธุรกรรมเสร็จสมบูรณ์และยืนยันผลลัพธ์ไปยังฐานข้อมูลแล้ว ระบบจะต้องแน่ใจว่าผลลัพธ์เหล่านั้นรอดพ้นจากความล้มเหลวที่ตามมา เนื่องจากไม่มีขอบเขตของการควบคุมที่ครอบคลุมชุดของธุรกรรม ระบบจัดการฐานข้อมูล (DBMS) จึงไม่สามารถควบคุมเกินขอบเขตของธุรกรรมได้
ดังนั้นผู้ใช้ต้องรับประกันว่าหากระบบแจ้งว่ามีบางอย่างเกิดขึ้น แสดงว่ามี "บางอย่าง" เกิดขึ้นจริง เนื่องจากตามคำนิยามแล้ว ธุรกรรมใด ๆ (สำเร็จลุล่วง - S.K.) นั้นถูกต้อง ผลลัพธ์ของธุรกรรมที่ไม่ถูกต้องปรากฏขึ้นอย่างหลีกเลี่ยงไม่ได้ (เช่น ธุรกรรมที่มีข้อมูลที่ผิดพลาด) สามารถถูกกำจัดได้โดยธุรกรรม "เคาน์เตอร์" ที่เกี่ยวข้องเท่านั้น (ธุรกรรมเคาน์เตอร์)
3.2 การเกิดขึ้นของธุรกรรม
คุณสมบัติทั้งสี่นี้ ได้แก่ Atomicity, Consistency, Isolation และ Durability (ACID) อธิบายคุณลักษณะหลักของกระบวนทัศน์ของทรานแซกชันที่ส่งผลต่อการออกแบบระบบฐานข้อมูลหลายด้าน ดังนั้นเราจึงเชื่อว่าความสามารถของระบบใด ๆ เพื่อรองรับการทำธุรกรรมเป็นมาตรฐาน (การทดสอบกรด) ของคุณภาพของระบบนี้
โปรแกรม PL/1-SQL อย่างง่ายที่โอนเงินจากบัญชีหนึ่งไปยังอีกบัญชีหนึ่ง
FUNDS_TRANSFER. PROCEDURE,
$BEGIN_TRANSACTION;
ON ERROR DO; /* in case of error */
$RESTORE_TRANSACTION, /* undo all work */
GET INPUT MESSAGE; /* reacquire input */
PUT MESSAGE ('TRANSFER FAILED'); /* report failure */
GO TO COMMIT;
END;
GET INPUT MESSAGE; /* get and parse input */
EXTRACT ACCOUNT_EBIT, ACCOUNT_CREDIT,
AMOUNT FROM MESSAGE,
$UPDATE ACCOUNTS /* do debit */
SET BALANCE ffi BALANCE - AMOUNT
WHERE ACCOUNTS.NUMBER = ACCOUNT_DEBIT;
$UPDATE ACCOUNTS /* do credit */
SET BALANCE = BALANCE + AMOUNT
WHERE ACCOUNTS.NUMBER = ACCOUNT_CREDIT;
$INSERT INTO HISTORY /* keep audit trail */
<DATE, MESSAGE>;
PUT MESSAGE ('TRANSFER DONE'); /* report success */
COMMIT: /* commit updates */
$COMMIT_TRANSACTION;
END; /* end of program */
ฉันได้ให้ตัวอย่างโค้ดนี้เพื่อเตือนคุณว่า อันที่จริง คุณสมบัติของกรด ในแง่หนึ่ง ถือได้ว่าเป็นข้อกำหนดสำหรับ DBMS ใด ๆ ที่อ้างสิทธิ์ในการสนับสนุนธุรกรรม และในทางกลับกัน เป็นคำจำกัดความของธุรกรรมในระบบฐานข้อมูล คำจำกัดความนี้สอดคล้องกับการปฏิบัติทางโลกอย่างเต็มที่ เป็นเรื่องยากที่จะจินตนาการ ตัวอย่างเช่น ลูกค้าที่ทำธุรกรรมธนาคาร (ไม่ว่าจะด้วยความช่วยเหลือจากพนักงานธนาคารหรือใช้บริการธนาคารทางอินเทอร์เน็ต) ไม่คาดหวังว่าธนาคารจะตอบสนองคุณสมบัติทั้งหมดของ ACID ธนาคารที่ไม่รองรับคุณสมบัติของกรดในการทำธุรกรรมจะดีที่สุดคือสูญเสียลูกค้าและที่เลวร้ายที่สุดคือล้มละลาย
3.3 การเชื่อมต่อกรด
เป็นสิ่งสำคัญอย่างยิ่งที่คุณสมบัติของกรดจะแยกออกจากกันไม่ได้ การละทิ้งคุณสมบัติใด ๆ จะทำให้ชุดค่าผสมที่เหลือไม่มีความหมาย โดยเฉพาะอย่างยิ่ง หากเราละทิ้งคุณสมบัติความสอดคล้อง (ตามความหมายที่ใช้ในข้อความข้างต้น) เราจะสูญเสียเกณฑ์สำหรับความถูกต้องของการทำธุรกรรม ระบบฐานข้อมูลจะไม่สามารถตัดสินใจในทางที่มีความหมายว่าการทำธุรกรรมจะได้รับอนุญาตหรือไม่กระทำ และการตรวจสอบความถูกต้องของการดำเนินการในสถานะปัจจุบันของฐานข้อมูลทั้งหมดจะต้องดำเนินการในรหัสแอ็พพลิเคชัน
คุณต้องเข้าใจว่าในกรณีนี้เรากำลังพูดถึงความสอดคล้องเชิงตรรกะ ลูกค้าของธนาคารต้องการให้ธนาคารทำงานตามกฎที่กำหนดโดยเขาและลูกค้าทราบ ดังนั้นจึงเป็นไปไม่ได้ที่จะดำเนินการธุรกรรมใด ๆ ที่ละเมิดกฎเหล่านี้ เพื่อให้ธุรกรรมถัดไปของลูกค้ารายเดียวกันถูกดำเนินการใน สิ่งแวดล้อมตกลงตามกฎเหล่านี้
ลูกค้าของร้านค้าออนไลน์ต้องการให้สินค้าที่เขาสั่งซื้อและชำระเงินส่งถึงเขาในเวลาที่เหมาะสม (ตามกฎที่กำหนดและเป็นที่รู้จักของลูกค้า) ไม่อย่างนั้นเขาจะไม่ไว้ใจร้านนี้ ในขณะเดียวกัน ลูกค้าของธนาคารหรือลูกค้าของร้านอินเทอร์เน็ตก็ไม่สนใจเกี่ยวกับครัวภายในขององค์กร การดำเนินการภายในใดที่ต้องทำเพื่อทำธุรกรรมให้เสร็จสมบูรณ์ ลูกค้าไม่สนใจว่าจะรักษาความสอดคล้องทางกายภาพขององค์กรนี้อย่างไร การดำเนินการในระดับกายภาพเป็นอย่างไร
หาก DBMS ดูแลการรักษาความสอดคล้องทางตรรกะของธุรกรรม (และฐานข้อมูล) แอปพลิเคชันก็จะง่ายขึ้น เข้าใจได้มากขึ้น และเชื่อถือได้มากขึ้น ตรรกะทั้งหมดของพื้นที่แอปพลิเคชัน (ธนาคาร ร้านค้า คลังสินค้า ฯลฯ) เกี่ยวกับธุรกรรมและสถานะที่ถูกต้องของข้อมูลจะเข้าสู่ระบบฐานข้อมูล และข้อกำหนดสำหรับระบบนี้ง่ายมาก: รองรับธุรกรรม ACID โดยคำนึงถึงกฎความสอดคล้องที่แอปพลิเคชันให้ไว้ในฐานข้อมูล จากมุมมองของฉัน การปฏิเสธธุรกรรม ACID สร้างความยุ่งยากให้กับนักพัฒนาแอปพลิเคชัน ซึ่งไม่ว่าคุณจะชอบหรือไม่ก็ตาม จะต้องดำเนินการบางอย่างที่คล้ายคลึงกันเพื่อตอบสนองความต้องการตามธรรมชาติของลูกค้า
และขอย้ำอีกครั้งว่าคุณสมบัติ ACID กำหนดแนวคิดของการทำธุรกรรม ในความเห็นของฉัน เพื่อให้มีความเป็นไปได้อย่างน้อยในการพูดคุยเกี่ยวกับระบบการจัดการข้อมูลธุรกรรมซึ่งไม่รองรับคุณสมบัติของความสอดคล้องของธุรกรรม จำเป็นอย่างยิ่งที่จะต้องกำหนดความหมายของคำว่าธุรกรรมในกรณีนี้
น่าเสียดายที่ทุกวันนี้ ในหลาย ๆ กรณี (โดยเฉพาะอย่างยิ่ง นี่เป็นลักษณะเฉพาะของทิศทางของ NoSQL) ผู้คนพูดถึงการรองรับแอปพลิเคชัน OLTP โดยไม่ได้ระบุว่าหมายถึงธุรกรรมประเภทใดเลย ดังนั้นในบทความนี้ ฉันจะใช้ธุรกรรม ACID ที่รวมกันเพื่ออ้างถึงธุรกรรมจริง และธุรกรรมที่ไม่เข้าเงื่อนไขจะใช้ในความหมายที่ไม่เป็นทางการ ซึ่งแตกต่างกันในบริบทที่แตกต่างกัน
ให้เราจัดการกับ "ทฤษฎีบท" ของ CAP และพยายามค้นหาว่าความสอดคล้องหมายถึงอะไรในความหมายของบรูเออร์
GO TO FULL VERSION