日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql事务回滚后,自增ID仍然增加

發布時間:2025/3/12 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql事务回滚后,自增ID仍然增加 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

事務回滾后,自增ID仍然增加

回滾后,自增ID仍然增加。

比如當前ID是7,插入一條數據后,又回滾了。
然后你再插入一條數據,此時插入成功,這時候你的ID不是8,而是9.
因為雖然你之前插入回滾,但是ID還是自增了。

如果你認為自增ID不應該被事務化,那么其他事務不得不等待著,檢查自增ID是被使用還是被回滾,這就導致阻塞。比如下面的例子,A表使用自增ID。

User 1 ------------ begin transaction insert into A ... insert into B ... update C ... insert into D ... commit User 2 ----------- begin transaction insert into A ... insert into B ... commit

看以上的例子代碼,如果自增ID也要被事務化,那么假設user 2 的事務在user 1執行后的1毫秒后執行,那么他的插入到A表不得不等待User 1的整個事務結束,檢查第一個自增ID是不是被使用了。這就導致阻塞。

自增ID不被事務化是設計使然,不是bug,如果需要緊密連續的自增序列,建議采用其他方法生成。

--不連續沒關係,需要時候生成一列 if object_id('tb')is not null drop table tb go create table tb(ID int ) insert tb select 1 insert tb select 2 insert tb select 5 insert tb select 18 insert tb select 13 select id ,[newid]=(select count(*) from tb where id<=t.id) from tb t order by [newid] /*id newid ----------- ----------- 1 1 2 2 5 3 13 4 18 5(影響 5 個資料列) */

為什么mysql事務回滾后,自增ID依然自增

因為innodb的auto_increament的計數器記錄的當前值是保存在存內 存中的,并不是存在于磁盤上,當mysql
server處于運行的時候,這個計數值只會隨著insert改增長,不會隨著delete而減少。而當mysql
server啟動時,當我們需要去查詢auto_increment計數值時,mysql便會自動執行:SELECT MAX(id) FROM 表名
FOR UPDATE;語句來獲得當前auto_increment列的最大值,然后將這個值放到auto_increment計數器中。所以就算
Rollback MySQL的auto_increament計數器也不會作負運算。

總結

以上是生活随笔為你收集整理的mysql事务回滚后,自增ID仍然增加的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。