面试题答案
一键面试- 开启事务:
在PHP中使用SQLite时,开启事务通过调用
$pdo->beginTransaction()
方法。例如:
try {
$pdo = new PDO('sqlite:test.db');
$pdo->beginTransaction();
} catch (PDOException $e) {
echo "Connection failed: ". $e->getMessage();
}
- 提交事务:
使用
$pdo->commit()
方法来提交事务,这会使事务内的所有SQL操作永久生效。示例如下:
try {
$pdo = new PDO('sqlite:test.db');
$pdo->beginTransaction();
// 执行一些SQL操作
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES ('John', 30)");
$stmt->execute();
$pdo->commit();
} catch (PDOException $e) {
echo "Connection failed: ". $e->getMessage();
}
- 回滚事务:
使用
$pdo->rollBack()
方法来回滚事务,这会撤销事务内的所有SQL操作。示例如下:
try {
$pdo = new PDO('sqlite:test.db');
$pdo->beginTransaction();
// 执行一些SQL操作
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES ('John', 30)");
$stmt->execute();
// 假设出现错误需要回滚
throw new Exception("Some error occurred");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "Transaction rolled back: ". $e->getMessage();
}
- 事务场景示例: 假设有一个银行转账的场景,从账户A向账户B转账一定金额。这个操作涉及两个步骤:从账户A扣除金额和向账户B增加金额。这两个操作必须要么全部成功,要么全部失败,以保证数据的一致性。如果只执行了从账户A扣除金额,而向账户B增加金额失败,会导致数据不一致。
对应的PHP代码如下:
try {
$pdo = new PDO('sqlite:bank.db');
$pdo->beginTransaction();
// 从账户A扣除金额
$stmt = $pdo->prepare("UPDATE accounts SET balance = balance - :amount WHERE account_id = :from_account");
$stmt->bindParam(':amount', $amount, PDO::PARAM_INT);
$stmt->bindParam(':from_account', $fromAccount, PDO::PARAM_INT);
$stmt->execute();
// 向账户B增加金额
$stmt = $pdo->prepare("UPDATE accounts SET balance = balance + :amount WHERE account_id = :to_account");
$stmt->bindParam(':amount', $amount, PDO::PARAM_INT);
$stmt->bindParam(':to_account', $toAccount, PDO::PARAM_INT);
$stmt->execute();
$pdo->commit();
echo "Transfer successful";
} catch (PDOException $e) {
$pdo->rollBack();
echo "Transfer failed: ". $e->getMessage();
}
在上述代码中,accounts
表包含account_id
和balance
字段,$amount
、$fromAccount
和$toAccount
是定义好的变量,分别表示转账金额、转出账户ID和转入账户ID。如果在执行任何一个UPDATE
语句时出现错误,事务会回滚,确保账户余额数据的一致性。