2016-04-18 42 views
2

在笨,我們使用從數據庫中檢索最後插入的ID風險會混淆如果流量高?

* (Method that inserts a new row in the DB) * 

然後:

last_id = $this->db->insert_id(); 

要檢索DB的 「流芳百世創建」 行的ID。

如果我們的應用程序的流量非常高,會不小心得到另一個用戶創建的東西的ID?

流量:

  1. 插入一行,數據庫
  2. 運行INSERT_ID的方法來獲得 「最後插入的ID」
  3. 使用該ID

是另一個用戶可能已經在步驟#1 &#2之間創建了一個新行的風險?

或者無論交通是什麼,它是「即時」嗎?

如果不是,我們如何才能最好地防止混合中間步驟與高流量?

回答

4

不,這不是問題。最後一個插入ID是每個連接的值。如果另一個用戶創建一個行,他們有不同的連接,所以它不會影響第一個應用程序使用的連接。

documentation

已生成被保持在服務器上的每連接基礎的ID。這意味着函數返回給定客戶端的值是第一個爲最近一條語句生成的第一個AUTO_INCREMENT值,它影響該客戶端的一個AUTO_INCREMENT列。即使它們生成自己的AUTO_INCREMENT值,該值也不會受到其他客戶端的影響。此行爲可確保每個客戶端都可以檢索自己的ID,而不必關心其他客戶端的活動,而無需鎖定或事務。

1

不,沒有風險,除非使用相同的連接插入另一行。

如果你想,只是存儲你的第一個插入ID在一個變量:

$last_id1 = $this->db->insert_id(); //Pretend its 10 
//...Another insertion here... 
$last_id2 = $this->db->insert_id(); //Pretend its 13 

現在輸出這兩個值:

echo "ID1: $last_id1"; //Prints 'ID1: 10' 
echo "ID2: $last_id2"; //Prints 'ID2: 13' 

現在,您將能夠與第一工作值在其他時刻,即使有其他行插入

相關問題