事务是针对数据库本身的操作
#Thinkphp3.2 事务分为两中情况:
应用逻辑
启动事务:
$user->startTrans();
提交事务:
$user->commit();
事务回滚:
$user->rollback();
#1.对象类型
// 在User模型中启动事务
$User->startTrans()
// 进行相关的业务逻辑操作
$Info = M(“Info”); // 实例化Info对象
I
n
f
o
−
>
s
a
v
e
(
Info->save(
Info−>save(User); // 保存用户信息
if (操作成功)
U
s
e
r
−
>
c
o
m
m
i
t
(
)
;
e
l
s
e
User->commit(); else
User−>commit();elseUser->rollback()
#2.过程类型
M()->startTrans();//开启事务
if(){
M()->commit();//执行
}else{
M()->rollback();//事务回滚
}
#mysql 事务:
菜鸟mysql 事务讲解: http://www.runoob.com/mysql/mysql-transaction.html
#1.mysqli
$dbhost = 'localhost:3306'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
mysqli_query($conn, "set names utf8");
mysqli_select_db( $conn, 'RUNOOB' );
mysqli_query($conn, "SET AUTOCOMMIT=0");
//设置为不自动提交,因为MYSQL默认立即执行
mysqli_begin_stransaction($con);
执行sql 语句
mysqli_commit($con);
mysqli_close($con);
#2.PDO
$dp = 'mysql:host=127.0.0,1;dbname=test';
try{
$this->_pdo = new PDO($dp,'root','123');
}catch(PDOException $e){
echo '数据链接失败'.$e->getMessage();
exit;
}
开启事务
ty{
$_pdo->beginTransaction();
$sql_forlock = 'select * from goods where id = '.$gid .' limit 1 for update';//数据库锁表 innodb
$result = $pdo->query($sql_forlock,PDO::FETCH_ASSOC);
$goodsInfo = $result->fetch();
如果没有成功
$_pdo->rollback();
如果成功
$_pdo->commit();
}catch(PDOException $e){
echo $e->getMessage();
$pdo->rollBack();
}
#redis 事务
单个redis命令的执行是原子性的,但redis 没有在事务上增加任何维持原子性的机制,
所以redis事务的执行并不是原子性的,redis事务可以理解为一个打包的批量执行脚本,
中间某条命令的失败会导致前面已做指令的回滚,也不可造成后续的指令不做。
multi //开启事务
set name spicy
set js gs
exec //执行
discard //放弃执行事务
Yii 事务
$db = Yii::$app->db;
$transaction = $db->beginTransaction();
try {
$db->createCommand($sql1)->execute();
$db->createCommand($sql2)->execute();
// ... executing other SQL statements ...
$transaction->commit();
} catch(\Exception $e) {
$transaction->rollBack();
throw $e;
} catch(\Throwable $e) {
$transaction->rollBack();
throw $e;
}