MySQL事务是一组一起执行或都不执行的SQL语句。事务的主要目的是确保数据的完整性和一致性。在MySQL中,事务默认是自动提交的,这意味着每条SQL语句都会立即执行并提交更改。但是,可以通过设置来改变这种行为。
MySQL支持两种事务隔离级别:
事务广泛应用于需要确保数据完整性和一致性的场景,如银行转账、订单处理、库存管理等。
在PHP中,可以使用PDO(PHP Data Objects)或MySQLi扩展来设置和管理MySQL事务。
try {
// 创建PDO连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 开始事务
$pdo->beginTransaction();
// 执行SQL语句
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
// 提交事务
$pdo->commit();
} catch (Exception $e) {
// 回滚事务
$pdo->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
// 创建MySQLi连接
$mysqli = new mysqli('localhost', 'username', 'password', 'test');
// 检查连接
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
// 开始事务
$mysqli->begin_transaction();
try {
// 执行SQL语句
$mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
// 提交事务
$mysqli->commit();
} catch (Exception $e) {
// 回滚事务
$mysqli->rollback();
echo "Transaction failed: " . $e->getMessage();
}
问题原因:事务未提交或回滚可能是由于代码逻辑错误、异常处理不当或数据库连接问题导致的。
解决方法:
问题原因:事务隔离级别设置不当可能导致脏读、不可重复读或幻读等问题。
解决方法:
setAttribute
方法:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->exec("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
领取专属 10元无门槛券
手把手带您无忧上云