关于PDO 开启事物的问题

半支烟z 2016-12-09 11:22:16
public function shiwuAction()
{
try
{
DBData::trans_begin();

$sql = "select * from test where id=1";
$arr = DBData::select($sql);

$num = $arr['num'];
echo "num:".$num; echo "<br>";

$sql = "update test set num = num+10 where id=1";
$upnum = DBData::execsql($sql,2);
echo $upnum;
DBData::trans_rollback();
return false;

$sql = "select * from test where id=1";
$arr = DBData::select($sql);
echo "<hr>";
var_dump($arr);
DBData::trans_commit();
} catch (PDOException $e)
{
DBData::trans_rollback();
}
}

-----说明
$upnum = DBData::execsql($sql,2); 这个为执行sql语句后,返回影响的条数(参数2代表返回影响的条数,0代表什么也不返回)

/**
* 开启事务
*/
public static function trans_begin($val=1)
{
if($val==1)
{
self::setdbw();
self::$dbw->beginTransaction();//开启事务处理
}

}

/**
* 提交事务
*/
public static function trans_commit($val=1)
{
if($val==1)
{
self::setdbw();
self::$dbw->commit();//交易成功就提交
self::$dbw->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
}

}

/**
* 回滚事务
*/
public static function trans_rollback($val=1)
{
if($val==1)
{
self::setdbw();
self::$dbw->rollBack();
self::$dbw->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
}

}

...全文
187 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-12-09
  • 打赏
  • 举报
回复
1、你的表模式是否支持事务? 2、事务默认是自动提交的,并未看到你有关闭自动提交
半支烟z 2016-12-09
  • 打赏
  • 举报
回复
问题: 为什么update仍然的被执行了?
半支烟z 2016-12-09
  • 打赏
  • 举报
回复
引用 4 楼 hy215215 的回复:
1:你的是不是支持事务的表 2:try /catch 是捕获错误的,有错误才会执行,如果没有错误直接执行,你的update除非报错,才被回滚,没有保存不会被捕获。 你应该判断执行结果影响的行数,来判断是否提交或者回滚。
1)表支持事务 2)就是执行到最后的时候,数据库里已经有数据了的,但是在程序里的var_dump 打印事务中新加入的那条记录就是空的
hy215215 2016-12-09
  • 打赏
  • 举报
回复
1:你的是不是支持事务的表 2:try /catch 是捕获错误的,有错误才会执行,如果没有错误直接执行,你的update除非报错,才被回滚,没有保存不会被捕获。 你应该判断执行结果影响的行数,来判断是否提交或者回滚。
半支烟z 2016-12-09
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
1、你的表模式是否支持事务? 2、事务默认是自动提交的,并未看到你有关闭自动提交
刚才那段程序是我表弄错了,我重新弄成innob表了 从新写了个新的测试 public function shiwuAction() { DBData::setSqlDebug(); try { DBData::trans_begin(); $sql = "insert into test(num)values(10)"; $id = DBData::execsql($sql,1); echo "插入id:".$id; echo "<br>"; $sql = "update test set num = num+10 where id='$id'"; $upnum = DBData::execsql($sql, 2); echo "影响条数:".$upnum; echo "<br>"; $sql = "select * from test where id=$id"; $arr = DBData::select($sql); echo "<hr>"; var_dump($arr); DBData::trans_commit(); } catch (PDOException $e) { DBData::trans_rollback(); } } 结果这个var_dump($arr); 为空

21,886

社区成员

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

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