事务回滚

Php小小菜鸟 2018-10-22 10:26:28
Mysql::construct();
Mysql::$mydqldb->beginTransaction();//开启事务
try{
$sql13="UPDATE verydows_goods SET cate_ids =333 WHERE goods_id in (4,5,6)";
$res=Mysql::$mydqldb->exec($sql13);
$sql="insert into verydows_goods (goods_brief,goods_content) VALUES (111,222)";
$res=Mysql::$mydqldb->exec($sql);
Mysql::$mydqldb->commit();//事务提交
}catch (Exception $e){
echo "<pre>";print_r($e->getMessage());echo "<pre>";
Mysql::$mydqldb->rollback();//事务回滚
}


事务不能回滚 怎么回事 大神看看
...全文
191 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
274795192 2018-10-23
  • 打赏
  • 举报
回复
catch 语句调试下var_dump($Exception ) 可能抛出的不是这种默认异常,异常无法捕获导致catch块 事务回滚语句没有执行
下雨的声音丶 2018-10-23
  • 打赏
  • 举报
回复
那你这个有走到 catch 分支里面去吗?
Php小小菜鸟 2018-10-23
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
虽然 $sql 有误
但是 $res=Mysql::$mydqldb->exec($sql); 是否会触发异常,是由你的 Mysql 类决定的

表类型是InnoDB

$res=Mysql::$mydqldb->exec($sql); 如果我把这个执行语句 换成框架的Yii::app()->db->createCommand($sql)->execute(); 这样就可以回滚

$res=Mysql::$mydqldb->exec($sql); 我用的是PDO原生的执行语句就不能回滚
Php小小菜鸟 2018-10-23
  • 打赏
  • 举报
回复
引用 2 楼 qq_23033339 的回复:
你的表引擎是InnoDB吗?
我的表引擎是InnoDB
$res=Mysql::$mydqldb->exec($sql); 如果我把这个执行语句 换成框架的Yii::app()->db->createCommand($sql)->execute(); 这样就可以回滚

$res=Mysql::$mydqldb->exec($sql); 我用的是PDO原生的执行语句就不能回滚
Php小小菜鸟 2018-10-23
  • 打赏
  • 举报
回复
<?php
/**
* Created by PhpStorm.
* User: hqj
* Date: 2018/10/21
* Time: 22:09
*/

class Mysql
{


static $pdo;

/*
* Mysql配置
* */
static function construct()
{
$dbms='mysql'; //数据库类型
$host='XXXXXX'; //数据库主机名
$dbName='XXXXX'; //使用的数据库
$user='XXXXX'; //数据库连接用户名
$pass='XXXXXX'; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
static ::$pdo= new PDO($dsn, $user, $pass); //初始化一个PDO对象
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br/>");
}
}

/*
* 查询数据
* $true=null默认 null代表查询全部数据 非null代表查询任意一条数据
* 返回二维数组/一维数组或者空数组 空数组代表无数据
* 用empty()来判断
* */
static function Fetchall($sql,$true=null)
{
static ::construct();
if(!is_null($true)){
return static ::$pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
}
return static ::$pdo->query($sql)->fetchall(PDO::FETCH_ASSOC);
}


/*
* 数据的增 删 改
* row代表影响的行数
* id代表最后插入的ID集合
* 返回false代表操作失败
* 返回二维数组代表操作成功
* */
static function Exec($data)
{
static ::construct();
if(is_array($data))
{
foreach ($data as $v)
{
$id['row'][]=static ::$pdo->exec($v);
$id['id'] []=static ::$pdo->lastInsertId();
}
}else{
$id['row'][]=static ::$pdo->exec($data);
$id['id'] []=static ::$pdo->lastInsertId();
}

if(in_array(0,$id['row'])){
return false;
}
return $id;
}



/*封装事务
* $data是一维数组 里面是每个SQL语句
* */
static function Transaction($data)
{
static ::construct();
static ::$pdo->beginTransaction();
try{
foreach ($data as $v)
{
static ::Exec($v);
}
static ::$pdo->commit();
return TRUE;
}catch (Exception $e)
{
return $e->getMessage();
static ::$pdo->rollBack();
}
}





/*
* 开启事务
* */
static function BeginTransactions()
{
static ::construct();
static ::$pdo->beginTransaction();
}


/*
* 提交事务
* */
static function Commit()
{
static ::construct();
static ::$pdo->commit();
}


/*
* 回滚
* */
static function RollBack()
{
static ::construct();
static ::$pdo->rollBack();
}
}


这是我封装的mysql相关语句 麻烦看下 是不是哪里有问题 导致不能回滚
Php小小菜鸟 2018-10-23
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
你包装的可真够可以的!一点都看不出 PDO 的影子

php 的异常处理是 php5.3 才开始引入的,之前已存在的函数、类、表达式等都不支持异常处理(除了个别重写的以外)
PDO 是在 php5.1 开始出现的,到 php5.3 才可以无误的使用
PDO 本身是支持异常处理的,但他出生的环境(php5.1)并不支持异常处理,所以他设计了两套错误处理方案
要使用 PDO 的异常处理,必须令 PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION
使用传统错误处理
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$dbh->query('SELECT * from FOO123');//一个不存在的表
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
}
print_r($dbh->errorInfo());

使用异常处理
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->query('SELECT * from FOO123');
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
}
print_r($dbh->errorInfo());
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$dbh->query('SELECT * from FOO123');
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
}
print_r($dbh->errorInfo());
运行后你就会发现:虽然启用了异常处理,传统的错误处理依然时生效的


还是不行 提示 There is no active transaction 在回滚那里报错
下雨的声音丶 2018-10-23
  • 打赏
  • 举报
回复
你的表引擎是InnoDB吗?
xuzuning 2018-10-23
  • 打赏
  • 举报
回复
虽然 $sql 有误
但是 $res=Mysql::$mydqldb->exec($sql); 是否会触发异常,是由你的 Mysql 类决定的
下雨的声音丶 2018-10-23
  • 打赏
  • 举报
回复
try {
  $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', 
      array(PDO::ATTR_PERSISTENT => true));
  echo "Connected\n";
} catch (Exception $e) {
  die("Unable to connect: " . $e->getMessage());
}

try {  
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $dbh->beginTransaction();
  $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
  $dbh->exec("insert into salarychange (id, amount, changedate) 
      values (23, 50000, NOW())");
  $dbh->commit();
  
} catch (Exception $e) {
  $dbh->rollBack();
  echo "Failed: " . $e->getMessage();
}
来着PHP官方文档 http://php.net/manual/zh/pdo.transactions.php
xuzuning 2018-10-23
  • 打赏
  • 举报
回复
你包装的可真够可以的!一点都看不出 PDO 的影子

php 的异常处理是 php5.3 才开始引入的,之前已存在的函数、类、表达式等都不支持异常处理(除了个别重写的以外)
PDO 是在 php5.1 开始出现的,到 php5.3 才可以无误的使用
PDO 本身是支持异常处理的,但他出生的环境(php5.1)并不支持异常处理,所以他设计了两套错误处理方案
要使用 PDO 的异常处理,必须令 PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION
使用传统错误处理
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$dbh->query('SELECT * from FOO123');//一个不存在的表
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
}
print_r($dbh->errorInfo());

使用异常处理
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->query('SELECT * from FOO123');
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
}
print_r($dbh->errorInfo());
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$dbh->query('SELECT * from FOO123');
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
}
print_r($dbh->errorInfo());
运行后你就会发现:虽然启用了异常处理,传统的错误处理依然时生效的

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧