現如今,Web開發行業已經發展到了一種不可或缺的程度,同時也呈現出一個趨勢,那就是web應用越來越逐漸復雜。因此,使用事務在PHP開發過程中已經成為了不可或缺的部分。 PHP的事務串行可以有效地控制數據的一致性,確保操作的準確性和安全性。
什么是事務?
在數據管理系統中,一個事務指的是一組對某個數據邏輯上的上的一些操作,這些操作要么全部完成,要么全部不完成,不會遺留任何一項操作的部分完成。
比如說,一個銀行定期存款的操作,如果不小心把客戶的錢分散到了不同的資金賬戶,這其中的每一個步驟都必須全部完成,即扣除客戶的活期賬戶金額,同時將其加入到上述的固定期限賬戶,同時完成相關的數據記錄等等操作。這就是一個事務。
以如下代碼作為例子:
//連接數據庫 $con=mysqli_connect("localhost","my_user","my_password","my_db"); //檢查鏈接是否成功,如果不成功,則提示錯誤信息 if (mysqli_connect_errno()) { echo "連接失敗: ".mysqli_connect_error(); } //針對事務,設置SQL語句 mysqli_query($con,"START TRANSACTION"); //執行一些列SQL語句 mysqli_query($con,"INSERT INTO Persons (FirstName, LastName, Age) VALUES ('Peter', 'Griffin', '35')"); mysqli_query($con,"INSERT INTO Persons (FirstName, LastName, Age) VALUES ('Glenn', 'Quagmire', '33')"); //提交結束 mysqli_query($con,"COMMIT");
上面的代碼就是一個簡單的事務,事務的核心邏輯是通過“BEGIN”,“COMMIT” 和 “ROLLBACK” 三個命令——構成的。在下面的代碼中,我們將模擬一個小例子來說明事務串行的重要性。
例如,在下面的這個數據表中,我們包含了用戶的ID、用戶名、密碼和年齡字段,這是一個典型的用來存儲用戶數據的表。在實例中,我們會首先沿用以上例子,將兩條INSERT語句放在一個事務中,確保將新用戶的數據插入到數據庫時都有效的存儲。 :
CREATE TABLE testtrans( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(255), password VARCHAR(255) NOT NULL, age INT(3) UNSIGNED );
如下代碼展示實現了多次執行時發生的錯誤,之后再模擬一遍,通過添加ROLLBACK語句實現“事務回滾”,即當一條INSERT語句出現錯誤時,整個事務就無法完成,所以新添加的數據行不會出現在數據庫中。:
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db"); if ($mysqli->connect_errno) { die("Connection failed: " . $mysqli->connect_error); } //開始事務 $mysqli->begin_transaction(); try{ $mysqli->query("INSERT INTO testtrans (username, password, age) VALUES('foo','bar',20)"); $mysqli->query("INSERTT INTO testtrans(username,password,age) VALUES('example','123',22)"); //提交事務 $mysqli->commit(); }catch(mysqli_sql_exception $exception){ $mysqli->rollback(); throw $exception; }
在上述代碼中,當我們第二次插入數據的時候,由于SQL語法錯誤,就像例子一展示的那樣,你將會看到一個包含錯誤的SQL語句的異常消息。
最后指出,這是僅僅是通過使用PHP內置的MySQLi類庫,能夠在大多數情況下讓事務工作良好,在特定情況下可能還需要其他的方法和技術。 但是,最重要的是保持理性、明確和始終如一的方法。