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();//事务回滚
}
事务不能回滚 怎么回事 大神看看
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();//事务回滚
}
事务不能回滚 怎么回事 大神看看
但是 $res=Mysql::$mydqldb->exec($sql); 是否会触发异常,是由你的 Mysql 类决定的
$res=Mysql::$mydqldb->exec($sql); 如果我把这个执行语句 换成框架的Yii::app()->db->createCommand($sql)->execute(); 这样就可以回滚$res=Mysql::$mydqldb->exec($sql); 我用的是PDO原生的执行语句就不能回滚
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());
运行后你就会发现:虽然启用了异常处理,传统的错误处理依然时生效的
$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
还是不行 提示 There is no active transaction 在回滚那里报错
/**
* 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相关语句 麻烦看下 是不是哪里有问题 导致不能回滚