簡體   English   中英

未提交的數據庫事務和自動增量列

[英]Un-committed database transactions and auto-increment columns

我今天遇到了一些奇怪的行為,並想知道它是否是預期的或標准的。 我們正在使用Hibernate來對抗MySQL5。 在編碼過程中我忘了關閉交易,我認為其他人可以聯系。

當我最終關閉事務時,運行代碼並檢查表,我注意到以下內容。 我一直錯誤地運行我的代碼而沒有關閉事務,因此沒有導致插入實際行,但是增加了自動增量代理主鍵值,因此我有一個間隙(即沒有id字段值為751至762)。

這是預期的還是標准的行為? 它可能因數據庫而異嗎? 和/或Hibernate自己的事務抽象是否會對此產生一些可能的影響?

是的,這是預期的。

如果你考慮一下:數據庫還能做什么? 如果您增加列,然后將其用作同一事務中其他插入的外鍵,並且當您正在執行其他人提交時,則他們無法使用您的值。 你會得到一個差距。

像Oracle這樣的數據庫中的序列工作方式大致相同。 一旦請求了特定值,它是否隨后被提交無關緊要。 它永遠不會被重用。 並且序列也不是絕對有序的。

這是非常期待的行為。 如果沒有它,db必須等待已經插入記錄的每個事務完成,然后再將新id分配給下一個插入。

是的,這是預期的行為。 該文檔非常好地解釋了它。

從5.1.22開始,實際上有三種不同的鎖定模式可以控制並發事務如何獲得自動增量值。 但是這三個都會導致回滾事務的間隙(回滾事務使用的自動增量值將被丟棄)。

數據庫序列不保證id序列沒有間隙。 它們被設計為與事務無關,只有這樣才能是非阻塞的。

您不需要間隙,您必須編寫自己的存儲過程以在事務上增加列,但這樣的代碼將阻止其他事務,因此您必須是carrefull。

你從SEQUENCE_TABLE中選擇CURRVAL WHERE TYPE =:YOUR_SEQ_NAME FOR UPDATE; UPDATE SEQUENCE_TABLE SET CURRVAL =:INCREMENTED_CURRVAL TYERE TYPE =:YOUR_SEQ。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM