標籤:詳細說明 sql語句 事物 state 結合 sql 復原事務 localhost root
/** * 資料庫連接
* $conn = mysql_connect(‘localhost‘, ‘root‘, ‘‘); * mysql_select_db(‘test‘, $conn); *mysql_query("SET NAMES GBK"); *支援事務的表必須是InnoDB類型 *一段事務中只能出現一次: *mysql_query(‘START TRANSACTION‘);//開始事務 *mysql_query(‘ ROLLBACK ‘);//復原事務 *mysql_query(‘COMMIT‘);//提交事務 * 上面的是最原始的寫法
*事務鎖:如果連個同步或非同步同時更新同樣的資料,那麼我們就要用到事務鎖住正在執行的sql語句,直到事務提交,下一條資料才能執行 *如果一段事務中出現多次復原事務,則在,提交事務時只將第一次復原前至開始事務後對資料庫的所有操作取消,第一次復原後至提交事務前所有對資料庫操作仍將有效,所以一般將復原語句僅放在提交事務語句前 *如果一段事務無提交語句,則從開始事務時以下的所有對資料庫操作雖執行(執行方法返回對錯),但對資料庫無影響,但是在執行下段開始務語句時,前段事務自動認可 * 以下樣本是我結合現有架構寫的測試檔案 * 提示:鎖住的資料查詢條件已經是唯一標識*/class test extends controller{ private $db; function __construct($options) { parent::__construct($options, []); $this->db = new MySql(); } function run(){ try { $this->db->beginTRAN(); $state = $this->db->getField("SELECT state FROM test WHERE id = 1 FOR UPDATE"); if($state == 2){ throw new Exception(‘已完成!‘); } $data= array( ‘state‘ =>2 ); $res = $this->db->update(‘test‘,$data,"id=1"); if(!$res){ throw new Exception(‘更新成功!‘); } $this->db->commitTRAN(); dump(‘成功‘);die; } catch ( Exception $e ) { $this->db->rollBackTRAN(); dump($e->getMessage());die; } }}
本文執行個體講解了PHP使用MySQL事物鎖的執行個體,並備有注釋加以詳細說明