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

2022-04-08 11:12:01 字數 1207 閱讀 7225

回滾後,自增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

gocreate 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 個資料列)

*/

事務回滾後,自增ID仍然增加。

回滾後,自增id仍然增加。比如當前id是7,插入一條資料後,又回滾了。然後你再插入一條資料,此時插入成功,這時候你的id不是8,而是9.因為雖然你之前插入回滾,但是id還是自增了。如果你認為自增id不應該被事務化,那麼其他事務不得不等待著,檢查自增id是被使用還是被回滾,這就導致阻塞。比如下面的例子...

為什麼mysql事務回滾後, 自增ID依然自增

事務回滾後,自增id仍然增加,回滾後,自增id仍然增加。比如當前id是7,插入一條資料後,又回滾了。然後你再插入一條資料,此時插入成功,這時候你的id不是8,而是9。因為雖然你之前插入回滾,但是id還是自增了。如果你認為自增id不應該被事務化,那麼其他事務不得不等待著,檢查自增id是被使用還是被回滾...

為什麼mysql事務回滾後,自增ID依然自增

因為innodb的auto increament的計數器記錄的當前值是儲存在存內 存中的,並不是存在於磁碟上,當mysql server處於執行的時候,這個計數值只會隨著insert改增長,不會隨著delete而減少。而當mysql server啟動時,當我們需要去查詢auto increment計...