MST

星途 面试题库

面试题:SQLite与PHP集成中如何处理事务

在SQLite与PHP语言集成开发中,阐述如何开启、提交和回滚事务,并举出一个可能需要使用事务的场景示例,同时写出对应的PHP代码片段。
19.7万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试
  1. 开启事务: 在PHP中使用SQLite时,开启事务通过调用$pdo->beginTransaction()方法。例如:
try {
    $pdo = new PDO('sqlite:test.db');
    $pdo->beginTransaction();
} catch (PDOException $e) {
    echo "Connection failed: ". $e->getMessage();
}
  1. 提交事务: 使用$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();
}
  1. 回滚事务: 使用$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();
}
  1. 事务场景示例: 假设有一个银行转账的场景,从账户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_idbalance字段,$amount$fromAccount$toAccount是定义好的变量,分别表示转账金额、转出账户ID和转入账户ID。如果在执行任何一个UPDATE语句时出现错误,事务会回滚,确保账户余额数据的一致性。