事務ID分配時間

  • 我們一般會用start transaction或begin開始一個事務,自然而言的我們認爲在這個時候就已經分配了一個事務ID,其實並不是這樣,我們下面來看一個案例
  • 首先我們添加測試數據
  • 事務ID分配時間
  • 事務ID分配時間
  • 事務ID分配時間
  • 我們開啓兩個客戶端,分別爲session1和session2,事務隔離級別爲RR
  • 事務ID分配時間
  • 大家心裏會有個疑問,爲什麼我sessio1先開啓的事務,但session2事務提交後,我還能看到了,這不成了不可重複讀了嗎,其實很簡單,那是因爲session1的start transaction;並沒有分配事務ID,到第5步的時候才分配,所以session1.trx_id>session2.trx_id,所以看到session2提交的數據這就很正常了
  • 那麼大家就會有疑問,RR隔離級別在什麼時候纔會分配事務ID呢,有兩種方法分配
    1. start transaction; 後面的第一個select
    2. 要不就以這種方式開啓一個事務 START TRANSACTION WITH CONSISTENT SNAPSHOT;
  • 下面我們來試下第一種方法, 我們把id=100的還是改爲1來做測試
    • 事務ID分配時間
    • 這時候session1查出來的值還是1,但是因爲我們在第3步已經爲session1分配了trx_id,而session2在step4才分配,因此session1.trx_id<session2.trx_id,所以就算session2提交了,session1也看不到
  • 下面我們來試下第二種方法
    • 事務ID分配時間
    • 還是沒看到session2修改後的100,那說明START TRANSACTION WITH CONSISTENT SNAPSHOT;就會分配事務ID
  • 提示:
    • 什麼時候分配事務ID,可以通過監控這個表的記錄 select * from information_schema.INNODB_TRX;每執行一步就看下數據,那麼就自然而然的知道是什麼時候分配的事務ID了
  • 發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章