inTransaction()

1. 定义

该方法检查数据库驱动是否存在一个尚未提交(已激活)的事务。 存在时返回 TRUE,失败则返回 FALSE。

注:

  • DLL 语句:数据定义类语句,包括数据库、表、字段、索引等数据库对象的定义,操作包括创建(create)、修改(alter)和删除(drop)
  • DML 语句:数据操作类语句,限于数据库记录的增(insert)、删(delete)、查(select)、改(update)
  • DCL 语句:数据控制类语句,定义数据库对象的访问权限和安全级别,例如授权(grant)和取消权限(revoke)等
  • MySQL 只有 InnoDB 引擎支持事务,MYISAM 引擎并不支持事务
  • 事务提交并不会自动判断提交的所有 SQL 语句的正确性,也不会自动回滚
  • 一旦开始事务,则只能使用PDO::commit()方法或PDO::rollBack()方法来完成事务

关于数据库的具体内容可转至我们的MySQL教程

2. 语法

PDO::inTransaction ( void ) : bool

3. 参数说明

该方法不传入任何参数。

4. 示例

<?php

// PDO::inTransaction()
// 检查数据库驱动是否存在一个尚未提交(已激活)的事务

try {
    $config = ['driver' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'charset' => 'utf8', 'user' => 'root', 'pwd' => 'mysql'];
    $dsn = sprintf('%s:host=%s;dbname=%s;charset=%s', $config['driver'], $config['host'], $config['dbname'], $config['charset']);
    $conn = new PDO($dsn, $config['user'], $config['pwd']);

} catch (PDOException $e) {
    error_log($e->getMessage()); // 将错误信息记录至日志
    echo $e->getMessage();
}

try {
    $conn->beginTransaction();// 启动一个事务
    $sql = "INSERT INTO `movie`(`name`, `rate`, `url`, `cover`) VALUES (:name, :rate, :url, :cover)";
    $statement = $conn->prepare($sql);
    $statement->execute(
        [
            ':name'=>'极速教程',
            ':rate'=>'9.9',
            ':url'=>'https://www.jisudev.com/',
            ':cover'=>'http://www.jisudev.com/static/images/logo.png'
        ]
    );

    $list = $conn->query('SELECT * FROM `movie`');

    if($conn->inTransaction()) echo '存在一个事务',"\n";
    else echo '事务未开启或已结束!',"\n";

    $conn->commit();// 提交事务

    if($conn->inTransaction()) echo '存在一个事务',"\n";
    else echo '事务未开启或已结束!',"\n";

} catch (PDOException $e) {
    $conn->rollBack();
    echo "发生了错误:",$e->getMessage();
}
/* 输出:
存在一个事务
事务未开启或已结束!
*/