pdo事务回滚的问题
程序员文章站
2022-06-12 11:27:38
...
try {
$dsn="mysql:host=localhost;dbname=dadao;port:3366";
$pdo = new PDO($dsn, "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->begintransaction();
$sql="insert into user(username) values(:username)";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(':username'=>'insert title1'));
$stmt->execute(array(':username'=>NULL));
$pdo->commit();
} catch (Exception $e) {
echo '事务异常,现在进行回滚';
echo $e->getMessage();
// 回滚事务
$pdo->rollBack();
}
一个简单的事务代码,数据库表user中username不允许为空。提示:事务异常,现在进行回滚 Column 'username' cannot be null1,数据库表没有写入。但是,将$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);删除后,就没有任何提示,且数据库中有记录插入。$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);这行代码不是设置的是错误的提示方式吗,为啥会影响数据库的插入。
$dsn="mysql:host=localhost;dbname=dadao;port:3366";
$pdo = new PDO($dsn, "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->begintransaction();
$sql="insert into user(username) values(:username)";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(':username'=>'insert title1'));
$stmt->execute(array(':username'=>NULL));
$pdo->commit();
} catch (Exception $e) {
echo '事务异常,现在进行回滚';
echo $e->getMessage();
// 回滚事务
$pdo->rollBack();
}
一个简单的事务代码,数据库表user中username不允许为空。提示:事务异常,现在进行回滚 Column 'username' cannot be null1,数据库表没有写入。但是,将$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);删除后,就没有任何提示,且数据库中有记录插入。$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);这行代码不是设置的是错误的提示方式吗,为啥会影响数据库的插入。
回复讨论(解决方案)
是的,是设置错误处理方式
没有 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try ... catch 结构不会生效
$pdo->rollBack(); 永远执行不到