2015-01-08 21 views
2

數據庫模式:booking_number(初級,不能自動增量),費(浮動),...等如何鎖定數據庫表中的CakePHP

的「booking_number」是每一個插入到遞增。 這不會由數據庫本身自動遞增。 「booking_number」必須在代碼中增加,並且由於其他原因無法自動完成。

如果我想插入一行,我將讀取最後一個 「booking_number」,將其增加並將新行寫回數據庫。 同時另一個用戶也插入一行,他閱讀 最後一項「booking_number」,與我閱讀的一樣,因爲我沒有 還寫了新的一行。他也會增加到相同的數值,並將其寫回。這將導致衝突。

因此,如果我可以鎖定數據庫表,則其他人無法讀取/寫入 表,直到有人完成讀取和寫入新行。

我可以在cakephp中鎖定數據庫表嗎? 我在哪裏可以得到參考書或代碼?

任何幫助表示讚賞!

+0

您可能不需要_lock_表這一點。按照您的描述運行您的代碼。當第二個進程嘗試添加具有相同值的新行時,重複鍵錯誤可以是_caught_。當_caught_時,重新執行。 – AgRizzo

+0

邑,我也這麼想。可以通過創建視圖/錯誤/ pdo_error.ctp來自定義錯誤消息。並顯示消息重試customer.Right? @AgRizzo – fiona

回答

0

試試這個

$model = $this->loadModel('Info_Table'); 
// if Info_Table model is not available in your controller 
$dbo = $model->getDataSource(); 

$dbo->execute(
     sprintf('LOCK TABLES %s AS %s WRITE;', 
      $model->table, 
      $model->alias 
     ) 
    ); 

// execute query 
$dbo->execute('UNLOCK TABLES'); 
+0

如果我的表名是info_table。我可以試試這個嗎? '$ dbo = Info_Table - > getDataSource(); $ dbo->執行( 的sprintf( 'LOCK TABLES%S AS%S WRITE;', $模型 - > Info_Table, $模型 - > info_table ) ); $ NewAutoID = Info_Table->找到( '第一', 陣列( '字段'=>數組( 'booking_number'), '訂單'=>數組( 'booking_number'=> 'DESC') ) ); $ dbo-> execute('UNLOCK TABLES'); '..................................... @ u2460470 – fiona

+0

$ model是模型對象。最新的型號名稱? – Supravat

+0

型號名稱爲Info_Table。而表名是info_table。 – fiona