php 使用PDO管理事务
事务是一组数据库操作,其中所有的操作必须全部成功或全部撤销。在MySQL中,可以使用PDO和mysql扩展程序来管理事务。以下是如何使用PDO管理事务的步骤:
配置PDO连接:
try {
pdo = new PDO('mysql:host=localhost;dbname=mydatabase', 'username', 'password');pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException e) {
echo 'Connection failed: ' .e->getMessage();
}
PHP
开始事务:
try {
pdo->beginTransaction();
} catch (PDOExceptione) {
echo 'Begin transaction failed: ' . $e->getMessage();
}
PHP
执行数据库操作:
try {
stmt =pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
stmt->execute(['name' => 'John Doe', 'email' => 'johndoe@example.com']);
} catch (PDOExceptione) {
pdo->rollback();
echo 'Insert failed: ' .e->getMessage();
}
PHP
提交或回滚事务:
try {
pdo->commit();
echo 'Transaction committed.';
} catch (PDOExceptione) {
pdo->rollback();
echo 'Transaction rolled back.';
echoe->getMessage();
}
使用mysql扩展程序管理事务
使用mysql扩展程序来管理事务的步骤跟PDO很相似。
配置mysql连接:
$mysqli = new mysqli('localhost', 'username', 'password', 'mydatabase');
if ($mysqli->connect_errno) {
echo 'Connection failed: ' . $mysqli->connect_error;
}
开始事务:
if (!$mysqli->autocommit(FALSE)) {
echo 'Begin transaction failed.';
}
执行数据库操作:
if (!mysqli->query("INSERT INTO users (name, email) VALUES ('John Doe', 'johndoe@example.com')")) {mysqli->rollback();
echo 'Insert failed: ' . $mysqli->error;
}
提交或回滚事务:
if (!mysqli->commit()) {mysqli->rollback();
echo 'Transaction rolled back.';
}
使用PDO和mysql扩展程序锁定表
表锁定是指在访问某个表时禁止其他会话对该表进行修改和读取。在MySQL中,可以使用PDO和mysql扩展程序来锁定表。
共享锁
共享锁用于防止其他会话对一个表进行写操作,但允许其他会话对该表进行读取。以下是如何使用PDO和mysql扩展程序进行共享锁的示例:
// PDO
stmt =pdo->prepare('SELECT name FROM users WHERE id = ? LOCK IN SHARE MODE');
stmt->execute([1]);
// mysqlresult = $mysqli->query('SELECT name FROM users WHERE id = 1 LOCK IN SHARE MODE');
PHP
排他锁
排他锁用于防止其他会话对一个表进行读取和写操作。以下是如何使用PDO和mysql扩展程序进行排他锁的示例:
// PDO
stmt =pdo->prepare('SELECT name FROM users WHERE id = ? FOR UPDATE');
stmt->execute([1]);
// mysqlresult = $mysqli->query('SELECT name FROM users WHERE id = 1 FOR UPDATE');