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

กลไกสำหรับการกระทำชุดการเปลี่ยนแปลงที่สอดคล้องกันลงในฐานข้อมูลแบบอะตอม

1
การทำธุรกรรมที่ชัดเจนจำเป็นต้องใช้ในขณะนี้ในวง?
SQL Server 2014: เรามีตารางที่มีขนาดใหญ่มาก (100 ล้านแถว) และเราจำเป็นต้องอัปเดตเขตข้อมูลสองสามแห่ง สำหรับบันทึกการจัดส่ง ฯลฯ เรายังต้องการเก็บไว้ในธุรกรรมที่มีขนาดพอดี หากเราปล่อยให้บิตรันด้านล่างแล้วยกเลิก / ยุติการค้นหางานที่ทำไปทั้งหมดจะถูกส่งไปหรือเราจำเป็นต้องเพิ่มคำสั่ง BEGIN TRANSACTION / END TRANSACTION เพื่อให้เราสามารถยกเลิกได้ตลอดเวลา? DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE …

2
ROLLBACK ไม่ทำงานหลังจาก INSERT INTO สร้างตารางปลายทางใหม่
ฉันกำลังทำงานกับสคริปต์ PHP ซึ่งนำเข้าไฟล์ CSV ( customers.csv) ลงในตาราง MySQL (customers ) ก่อนที่จะแทรกเนื้อหาของไฟล์ CSV ลงในตาราง mysql ฉันสำรองข้อมูลcustomersตารางดั้งเดิมก่อน ฉันกำลังห่อกระบวนการนำเข้าทั้งหมด (รวมถึงการสำรองข้อมูล) ในธุรกรรม mysql (เพื่อพิจารณากรณีที่ CSV เสียหายที่ไหนสักแห่งที่อยู่ตรงกลางและเพื่อให้แน่ใจว่าการนำเข้านั้นเป็นอะตอม) ปัญหาคือว่าย้อนกลับดูเหมือนจะไม่ทำงานเมื่อฉันเรียกมันว่าหลังจากที่INSERT INTOคำสั่ง: เมื่อตรวจสอบฐานข้อมูลผ่านทาง phpMyAdmin ฉันสามารถดูตารางที่สร้างขึ้นใหม่และแถวภายในมันยังคงอยู่หลังจาก roollback นี่คือบันทึกการทำงาน: [2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] [] [2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] [] [2015-01-19 14:08:28] DEBUG: CREATE TABLE …

1
ในกรณีที่มีการอัปเดตหลายระเบียนในรายการเดียวมีการจัดเก็บรุ่นกี่เวอร์ชัน
อ้างอิงจากบทความ MSDN โดย Kimberly L. Tripp การแยกธุรกรรมโดยใช้การควบคุมเวอร์ชันของSQL Server 2005 Rowของ Neal Graves "... ทุกรุ่นก่อนหน้าของเร็กคอร์ดที่เฉพาะเจาะจงจะถูกล่ามโซ่ไว้ในรายการที่เชื่อมโยงและในกรณีของการทำธุรกรรมที่อิงกับการทำเวอร์ชันแถวยาวรันลิงก์จะต้องถูกสำรวจในแต่ละการเข้าถึงเพื่อให้ได้เวอร์ชันที่สอดคล้องกันของธุรกรรม แถว" ซึ่งอยู่ในส่วน "การทำความเข้าใจกับการกำหนดเวอร์ชันของแถว" สำหรับการติดตามทั้ง "การกำหนดเวอร์ชันของแถวในการอ่านที่กระทำโดยใช้การกำหนดเวอร์ชันของแถว" และ "การกำหนดเวอร์ชันของแถวในการแยก Snapshot" เพิ่มเติมเกี่ยวกับตัวอย่างของการกำหนดเวอร์ชันของแถวเนื่องจากการปรับเปลี่ยนมีให้ในบริบทของการอัพเดตหลายรายการของเร็กคอร์ดเดียวกันโดยการทำธุรกรรมหลายรายการ (T1, T2, T3) ใน SNAPSHOT เท่านั้น ในกรณีที่มีเพียงหนึ่งธุรกรรมที่อัปเดตบันทึกหลายครั้ง (โดยหลายงบ) จะมีการจัดเก็บหลายรุ่น (เชื่อมโยง) หรือเฉพาะรายการที่ถ่ายในช่วงเวลาที่มีการ "จับภาพ" SNAPSHOT หรือไม่ คำตอบสำหรับคำถามนี้ควรตอบคำถามที่เกี่ยวข้องที่รอดำเนินการของฉันทันที: เหตุใดตัวแยกการกำหนดเวอร์ชันแถวใช้รายการรุ่นที่เชื่อมโยงของบันทึก RCSI ใช้พื้นที่น้อยกว่าหรือเหมือนกันมากกว่า SNAPSHOT หรือไม่ ทำไม?

1
การสร้างใบแจ้งหนี้และการติดตาม
ทุก 2 สัปดาห์ระบบจะสร้างใบแจ้งหนี้ให้กับ บริษัท บริษัท จะได้รับใบแจ้งหนี้ในวันที่ 1 และ 16 ของทุกเดือน (มันจะทำงานผ่าน Cron Job ทุก 2 สัปดาห์มันสแกนผ่านตารางคำสั่งซื้อแล้วเพิ่มลงในตาราง 'ใบแจ้งหนี้' มีทางเลือกอื่นหรือไม่) มีรายการคำสั่งซื้อของลูกค้าในordersตารางและยังระบุ บริษัท ที่เป็นของ ( orders.company_id) invoiceตารางการคำนวณค่าใช้จ่ายทั้งหมดของการสั่งซื้อจากordersตาราง ฉันกำลังพยายามหาวิธีการออกแบบการติดตามใบแจ้งหนี้ที่สมเหตุสมผล บริษัท บางครั้งจะต้องส่งค่าธรรมเนียมหรือบางครั้งฉันส่งค่าธรรมเนียม ( invoice.amount) ฉันต้องการติดตามใบแจ้งหนี้ด้วยสิ่งต่อไปนี้: เมื่อ บริษัท ส่งจำนวนเงินให้ฉัน ฉันส่งจำนวนเงินให้ บริษัท เมื่อใด ได้รับเงินจำนวนเท่าใดจาก บริษัท ฉันส่งไปยัง บริษัท เท่าไร ฉันได้รับเงินเต็มจำนวนหรือไม่ (ถ้าไม่ฉันต้องอัปเดตสิ่งใดใน Db) สถานะใบแจ้งหนี้ (ส่งใบแจ้งหนี้, ยกเลิก, จำนวนเงินที่ได้รับ, จำนวนเงินที่ส่ง) นี่คือการออกแบบฐานข้อมูลฉันมาด้วย: …

2
ฐานข้อมูลอัปเดตดัชนีในธุรกรรม ณ จุดใด
ฉันพยายามที่จะเข้าใจลำดับของเหตุการณ์ในส่วนแทรกที่ทั้งดัชนีและธุรกรรมเกี่ยวข้องกัน ตัวอย่างเช่นสถานะเอกสารของ Oracle: หากคุณสร้าง [หรือมี] ดัชนีอย่างน้อยหนึ่งรายการก่อนที่จะโหลดข้อมูลฐานข้อมูลจะต้องอัปเดตทุกดัชนีเมื่อแทรกแต่ละแถว แต่จะเกิดอะไรขึ้นถ้าฉันสร้างธุรกรรมแทรกห้าแถวจากนั้นส่งมอบ? มีการอัพเดตดัชนีสำหรับทุกส่วนแทรกหรือเพียงจุดที่กำหนดไว้หรือไม่ ลอจิกบอกฉันว่าพวกเขาจะได้รับการอัปเดต ณ จุดส่งมอบเท่านั้นเนื่องจากดัชนีที่อัพเดตไม่สามารถใช้งานได้จนกว่าจะมีการบันทึกข้อมูลเหล่านั้น แต่นั่นเป็นเรื่องจริงหรือ ถ้าเป็นเช่นนั้นเมื่อฉันมีการแทรก 1m แถวเพื่อประสิทธิภาพที่ดีที่สุดฉันควรทำคอมมิชชันขนาดใหญ่ของแถวทั้งหมดและไม่ใช่ 10 ทรานแซคชันของระเบียน 100k แน่นอนฉันตระหนักว่าความเสี่ยงนี้ย้อนกลับมากขึ้นถ้าแถว 999,999 ล้มเหลว ขอโทษถ้าคำศัพท์ของฉันออกมาเล็กน้อย ฉันไม่ได้เป็น DBA โดยการค้าขาย ฉันไม่ได้สนใจในฐานข้อมูลเฉพาะมากเท่าฐานข้อมูลโดยทั่วไปถึงแม้ว่า Oracle และ Postgres เป็นสิ่งที่ฉันใช้มากที่สุด ฉันค้นหาในหัวข้อนี้ แต่ไม่พบคำตอบที่ชัดเจนจริงๆ

1
การซิงโครไนซ์โดยใช้ทริกเกอร์
ฉันมีข้อกำหนดคล้ายกับการสนทนาก่อนหน้านี้ที่: การเขียนโครงสร้างธนาคารอย่างง่าย: ฉันจะรักษายอดคงเหลือของฉันให้สอดคล้องกับประวัติการทำธุรกรรมได้อย่างไร ทริกเกอร์ร่วมกับการทำธุรกรรม ฉันมีสองตาราง[Account].[Balance]และ[Transaction].[Amount]: CREATE TABLE Account ( AccountID INT , Balance MONEY ); CREATE TABLE Transaction ( TransactionID INT , AccountID INT , Amount MONEY ); เมื่อมีการแทรก update หรือลบกับ[Transaction]ตารางที่ควรได้รับการปรับปรุงขึ้นอยู่กับ[Account].[Balance][Amount] ขณะนี้ฉันมีทริกเกอร์ให้ทำงานนี้: ALTER TRIGGER [dbo].[TransactionChanged] ON [dbo].[Transaction] AFTER INSERT, UPDATE, DELETE AS BEGIN IF EXISTS (select 1 from [Deleted]) OR …

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

1
การวางคำสั่ง Select ในธุรกรรม
ข้อแตกต่างระหว่าง 2 ข้อความค้นหาเหล่านี้คืออะไร: START TRANSACTION; SELECT * FROM orders WHERE id=1; UPDATE orders SET username='John' WHERE id=1; COMMIT; และไม่มีการทำธุรกรรม: SELECT * FROM orders WHERE id=1; UPDATE orders SET username='John' WHERE id=1; ผลของการมีSELECTการทำธุรกรรมภายในคืออะไร? หากDELETE FROM orders WHERE id=1ถูกเรียกจากเซสชันอื่นหลังจากSELECTทั้งสองกรณีจะถูกประมวลผลเมื่อใด


2
การลบตาราง MySQL ด้วยธุรกรรมที่ค้างอยู่
มีวิธีการลบตาราง InnoDB หรือฐานข้อมูลที่มีธุรกรรมที่ค้างอยู่ใน MySQL (ควรอยู่ในระดับระบบไฟล์) หรือไม่? เกิดอะไรขึ้น: ฉันใช้ MySQL 5.5.28 และวิ่งLOAD DATA INFILE…เพื่อนำเข้าชุดข้อมูลขนาดใหญ่ (300M แถว) ลงในตาราง InnoDB ฉันไม่ได้ใช้set autocommit = 0;มาก่อน น่าเสียดายที่mysqldมีการหยุดกลางการนำเข้า เมื่อฉันรีสตาร์ทmysqlจะพยายามย้อนกลับธุรกรรมที่กรอกบันทึกของระบบด้วยข้อความเช่นนี้: mysqld_safe [4433]: 121212 16:58:52 InnoDB: กำลังรอ 1 ธุรกรรมที่กำลังจะเสร็จสิ้น ปัญหาคือการย้อนกลับทำงานมากกว่า 25 ชั่วโมงในขณะนี้ซึ่ง mysqldไม่ยอมรับการเชื่อมต่อซ็อกเก็ตใด ๆ ฉันไม่สามารถลบ/var/lib/mysql/*และเริ่มจากศูนย์ได้เนื่องจากมีบางฐานข้อมูล InnoDB / ตารางอื่น ๆ ในเครื่องนี้เช่นกัน อย่างไรก็ตามตารางที่มีปัญหานั้นเป็นตารางเดียวในฐานข้อมูลแยกต่างหาก การลบทั้งตารางหรือฐานข้อมูลทั้งหมดไม่ใช่ปัญหาเนื่องจากฉันสามารถนำเข้าข้อมูลทั้งหมดอีกครั้งในภายหลัง

3
บันทึกธุรกรรมจะลดขนาดโดยอัตโนมัติใน SQL Server หรือไม่
เมื่อฐานข้อมูล SQL Server ในโหมด SIMPLE คุณไม่ต้องสนใจเกี่ยวกับ bakcups บันทึกธุรกรรม แต่ในโหมด SIMPLE บันทึกธุรกรรมดูเหมือนว่าจะเพิ่มขึ้นเช่นเดียวกับในโหมดเต็ม มีการตัดทอนอัตโนมัติในบางช่วงเวลาหรือไม่? หรือฉันต้องตัดทอน / ย่อขนาดด้วยตนเองหรือไม่?


3
SQL Server อนุญาต (ทำให้มองเห็นได้) DDL ภายในธุรกรรมไปยังธุรกรรมก่อนที่จะส่งมอบหรือไม่?
ใน PostgreSQL ฉันสามารถสร้างตารางที่มีข้อมูลการทดสอบบางส่วนและจากนั้นในการทำธุรกรรมโยกย้ายไปยังคอลัมน์ใหม่ของรูปแบบที่แตกต่างกันส่งผลให้ในหนึ่งตารางเขียนเมื่อCOMMIT, CREATE TABLE foo ( a int ); INSERT INTO foo VALUES (1),(2),(3); ติดตามโดย, BEGIN; ALTER TABLE foo ADD COLUMN b varchar; UPDATE foo SET b = CAST(a AS varchar); ALTER TABLE foo DROP COLUMN a; COMMIT; อย่างไรก็ตามสิ่งเดียวกันใน SQL Server ของ Microsoft ดูเหมือนจะสร้างข้อผิดพลาด เปรียบเทียบซอ db db ที่ใช้งานได้โดยที่ADDคำสั่ง (คอลัมน์) …

4
ฉันจะเพิ่มการอ่านหลังจากที่ได้ทำรายการระดับการยุติการทำรายการแล้วหรือไม่?
ภายในโพรซีเดอร์ที่เก็บฉันมีดังต่อไปนี้: (sql server 2008) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION getStuff BEGIN TRY /* some selects, updates, etc, etc. */ .... COMMIT TRANSACTION getStuff END TRY BEGIN CATCH ... END CATCH เนื่องจากนี่คือธุรกรรมตามความคิดของฉันคือการเชื่อมต่อฐานข้อมูลส่วนที่เหลือจะไม่ได้รับผลกระทบจาก SERIALIZABLE ฉันต้องตั้งระดับการแยกโดยปริยายเพื่ออ่านความมุ่งมั่นหลังจากที่ส่งมอบหรือไม่? สิ่งนี้จะส่งผลกระทบต่อการเชื่อมต่ออื่น ๆ ระหว่างแอพพลิเคชันเซิร์ฟเวอร์และเซิร์ฟเวอร์ฐานข้อมูลของฉันหรือไม่

2
รายการข้อผิดพลาดการยกเลิกแบทช์ในเซิร์ฟเวอร์ SQL
ใน SQL Server ถ้า XACT_ABORT ปิดอยู่ข้อผิดพลาดบางอย่างจะยุติคำสั่งปัจจุบัน (ตัวอย่างเช่นการจัดหาจำนวนพารามิเตอร์ที่ไม่ถูกต้องให้กับกระบวนงานที่เก็บไว้ซึ่งใช้พารามิเตอร์บางตัว) และข้อผิดพลาดบางอย่างจะยกเลิกชุดทั้งหมด (ตัวอย่างเช่น ขั้นตอนที่ไม่ใช้พารามิเตอร์) [อ้างอิง]: http://www.sommarskog.se/error-handling-I.html#scope-abortion สิ่งที่ฉันอยากรู้คือว่ามีรายการที่ชัดเจนของข้อผิดพลาดที่มีการยกเลิกชุดและคนที่มีคำสั่งยกเลิก

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