TransactionScope รับประกันความสมบูรณ์ของข้อมูลในหลายฐานข้อมูลอย่างไร

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

แก้ไข:

ฉันเดาว่าสิ่งที่ฉันถามคือฉันสามารถพึ่งพา TransactionScope เพื่อรับประกันความสมบูรณ์ของข้อมูลเมื่อเขียนไปยังฐานข้อมูลหลายแห่งในกรณีที่ไฟฟ้าดับหรือปิดเครื่องกะทันหัน

ขอบคุณบาส

ตัวอย่าง:

    using(var scope=new TransactionScope())
    {
        using (var context = new FirstEntities())
        {
            context.AddToSomethingSet(new Something());
            context.SaveChanges();
        }

        using (var context = new SecondEntities())
        {
            context.AddToSomethingElseSet(new SomethingElse());
            context.SaveChanges();
        }

        scope.Complete();
    }

person Bas Smit    schedule 08.03.2010    source แหล่งที่มา
comment
อย่างไรก็ตาม คุณกำลังทำธุรกรรมการแยกแบบอนุกรมในโค้ดของคุณ   -  person Henrik    schedule 20.01.2012


คำตอบ (2)


ด้วยธุรกรรมแบบกระจาย ที่จริงแล้วอาจเกิดขึ้นได้ว่าฐานข้อมูลไม่สอดคล้องกัน คุณพูดว่า:

ในบางจุดฐานข้อมูลทั้งสองจะต้องได้รับคำสั่งให้ใช้การเปลี่ยนแปลง สมมติว่ามีไฟฟ้าดับหลังจากแจ้งให้ db แรกนำไปใช้ แสดงว่าฐานข้อมูลไม่ซิงค์กัน หรือฉันขาดอะไรบางอย่างไป?

คุณไม่ได้. ฉันคิดว่าสิ่งนี้เรียกว่าปัญหาทั่วไป พิสูจน์ได้ว่าไม่สามารถป้องกันได้ หน้าต่างแห่งความล้มเหลวนั้นค่อนข้างเล็ก

person usr    schedule 08.03.2010
comment
เท่าที่ฉันเข้าใจบทความวิกิพีเดียเกี่ยวกับปัญหาทั่วไป เนื่องจากข้อความและการรับทราบได้รับการแลกเปลี่ยนสำเร็จ (หรือที่เรียกว่าขั้นตอนที่กำหนดเองที่เขียนใน tx-log) 2PC จะหลีกเลี่ยงความไม่สอดคล้องกัน หากเครือข่ายของคุณล่มหลังจากเครือข่ายหนึ่งมีการคอมมิต และอีกเครือข่ายหนึ่งยังไม่ได้เตรียมการ เครือข่ายแรกจะเตรียมการได้สำเร็จ และเครือข่ายอื่นก็เช่นกัน (ไม่เช่นนั้นพวกเขาจะไม่ได้รับคำสั่งให้คอมมิต) เมื่อถึงจุดนี้ฐานข้อมูลแรกสามารถยอมรับเครือข่ายที่สองได้อย่างปลอดภัย ฐานข้อมูลจะกระทำเมื่อกลับมาออนไลน์ - person Henrik; 26.03.2010
comment
สิ่งนี้จะเกิดขึ้นได้ก็ต่อเมื่อคุณคิดว่าข้อความในจำนวนที่จำกัดเท่านั้นที่สามารถสูญหายได้ หากข้อความทั้งหมดอาจสูญหายในช่วงเวลาที่เลวร้ายที่สุด คุณจะยังคงสูญเสีย - person usr; 09.02.2011

โดยจะเลื่อนระดับเป็น Distributed Transaction Coordinator (msdtc) หากตรวจพบฐานข้อมูลหลายฐานข้อมูลซึ่งใช้แต่ละขอบเขตเป็นส่วนหนึ่งของการคอมมิตแบบ 2 เฟส การโหวตแต่ละขอบเขตที่จะกระทำ และด้วยเหตุนี้เราจึงได้คุณสมบัติ ACID แต่กระจายไปทั่วฐานข้อมูล นอกจากนี้ยังสามารถรวมเข้ากับ TxF, TxR ได้อีกด้วย คุณควรจะใช้มันได้ตามที่คุณอธิบาย

ฐานข้อมูลทั้งสองมีความสอดคล้องกันเนื่องจากธุรกรรมฐานข้อมูลแบบกระจาย COM+ ที่ทำงานภายใต้ MTC ได้แนบไว้กับฐานข้อมูลเหล่านั้น

หากฐานข้อมูลหนึ่งโหวตให้กระทำ (เช่น โดยทำ (:TransactionScope).Commit()) "มัน" จะบอก DTC ว่าโหวตให้กระทำ เมื่อฐานข้อมูลทั้งหมดได้ทำสิ่งนี้แล้ว พวกเขาจะมีรายการการเปลี่ยนแปลง ตราบใดที่ธุรกรรมฐานข้อมูลไม่หยุดชะงักหรือขัดแย้งกับธุรกรรมอื่น ๆ ในขณะนี้ (เช่น ด้วยอัลกอริธึมความยุติธรรมที่จองธุรกรรมหนึ่งรายการล่วงหน้า) การดำเนินการทั้งหมดสำหรับแต่ละฐานข้อมูลจะอยู่ในบันทึกธุรกรรม หากระบบสูญเสียพลังงานเมื่อยังไม่ได้คอมมิตสำหรับฐานข้อมูลหนึ่งเสร็จสิ้นแล้ว แต่ได้เสร็จสิ้นแล้วสำหรับอีกฐานข้อมูลหนึ่ง ระบบจะบันทึกไว้ในบันทึกธุรกรรมที่ทรัพยากรทั้งหมดโหวตให้คอมมิต ดังนั้นจึงไม่มีนัยเชิงตรรกะที่คอมมิตจะล้มเหลว ดังนั้น ครั้งถัดไปที่ฐานข้อมูลที่ไม่สามารถคอมมิตระบบได้ ธุรกรรมที่เหลือในสถานะไม่แน่นอนนี้ก็จะเสร็จสิ้น

person Henrik    schedule 08.03.2010
comment
ขอบคุณสำหรับคำตอบ แต่ฉันยังสับสนอยู่เล็กน้อย ในบางจุดฐานข้อมูลทั้งสองจะต้องได้รับคำสั่งให้ใช้การเปลี่ยนแปลง สมมติว่ามีไฟฟ้าดับหลังจากแจ้งให้ db แรกนำไปใช้ แสดงว่าฐานข้อมูลไม่ซิงค์กัน หรือฉันขาดอะไรบางอย่างไป? - person Bas Smit; 08.03.2010
comment
ฉันหมายถึงฐานข้อมูลทั้งสองนั้นถูกต้องแยกกัน แต่ฐานข้อมูลเหล่านั้นไม่ซิงค์กันอีกต่อไป - person Bas Smit; 08.03.2010
comment
ฉันได้เพิ่มมากขึ้นในคำตอบของฉัน ดูลิงค์วิกิพีเดียสำหรับลิงค์และแหล่งข้อมูลเพิ่มเติม ในระยะสั้น; มันทำงานได้โดยที่ฐานข้อมูลไม่ซิงค์กัน (พวกเขาใช้ 2PC ภายในด้วย) หากคุณใช้ TransactionScopes คุณก็ไม่ต้องกังวลอะไร มีรายละเอียดเพิ่มเติมที่สามารถนำไปใช้กับคำตอบนี้ได้ เช่นการเขียนดิสก์ไม่ได้เป็นอะตอมที่ตรงกันข้ามกับสมมติฐานจากระบบฐานข้อมูลและฮาร์ดไดรฟ์ประเภทใดที่คุณควรใช้เพื่อรับประกันให้มากที่สุด (forums.bit-tech.net/showthread.php?t=146156) - person Henrik; 08.03.2010
comment
@Bas Smit: ด้วยความเคารพ Henrik ได้ให้ข้อมูลอ้างอิงแก่คุณแล้วซึ่งอธิบายวิธีการทำงานของ 2PC โดยละเอียด โดยเฉพาะอย่างยิ่ง โปรดดูการอ้างอิงของ Bernstein ที่ด้านล่างของบทความ Wikipedia คำถามที่คุณถามไม่ใช่เรื่องใหม่ และคุณสามารถ (1) อ่านบน 2PC หากคุณต้องการทราบว่าการกู้คืนทำงานอย่างไร หรือ (2) เพียงยอมรับว่าปัญหาเหล่านี้ได้ถูกหยิบยกมาก่อนหน้านี้แล้ว เฮนริกตอบคำถามของคุณ และไม่จำเป็นที่เขาจะต้องอธิบายรายละเอียดทั้งหมดของโปรโตคอลที่ค่อนข้างซับซ้อน - person Craig Stuntz; 08.03.2010