mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...

好的,我正在寻找使用PHP在MySQL中进行“嵌套”事务的解决方案,并且正如您在MySQL文档中所知的那样,不可能在事务内进行事务(Mysql transactions within transactions).我试图使用http://php.net/manual/en/pdo.begintransaction.php中建议的Database类,但不幸的是,这对我来说是错误的,因为它的计数器范围是对象级别而不是类级别,为了解决此问题,我创建了具有计数器(名为$nest)的此类(TransactionController)静态的,它带来了使事务“线性”(带有“线性”)所需的类级别:我说的是:它显然是嵌套的,但是如果您看起来它不是嵌套的,那么事务将运行良好,您认为呢? ?(最后看例子,车主)

class TransactionController extends \\PDO {

public static $warn_rollback_was_thrown = false;

public static $transaction_rollbacked = false;

public function __construct()

{

parent :: __construct( ... connection info ... );

}

public static $nest = 0;

public function reset()

{

TransactionController :: $transaction_rollbacked = false;

TransactionController :: $warn_rollback_was_thrown = false;

TransactionController :: $nest = 0;

}

function beginTransaction()

{

$result = null;

if (TransactionController :: $nest == 0) {

$this->reset();

$result = parent :: beginTransaction();

}

TransactionController :: $nest++;

return $result;

}

public function commit()

{

$result = null;

if (TransactionController :: $nest == 0 &&

!TransactionController :: $transaction_rollbacked &&

!TransactionController :: $warn_rollback_was_thrown) {

$result = parent :: commit();

}

TransactionController :: $nest--;

return $result;

}

public function rollback()

{

$result = null;

if (TransactionController :: $nest >= 0) {

if (TransactionController :: $nest == 0) {

$result = parent :: rollback();

TransactionController :: $transaction_rollbacked = true;

}

else {

TransactionController :: $warn_rollback_was_thrown = true;

}

}

TransactionController :: $nest--;

return $result;

}

public function transactionFailed()

{

return TransactionController :: $warn_rollback_was_thrown === true;

}

// to force rollback you can only do it from $nest = 0

public function forceRollback()

{

if (TransactionController :: $nest === 0) {

throw new \PDOException();

}

}

}

class CarData extends TransactionController {

public function insertCar()

{

try {

$this->beginTransaction();

... (operations) ...

$this->commit();

}

catch (\PDOException $e) {

$this->rollback();

}

}

}

class PersonData extends TransactionController {

public function insertPerson( $person=null )

{

try {

$this->beginTransaction();

... (operations) ...

$this->commit();

}

catch (\PDOException $e) {

$this->rollback();

}

}

}

class CarOwnerData extends TransactionController {

public function createOwner()

{

try {

$this->beginTransaction();

$car = new CarData();

$car->insertCar();

$person = new PersonData();

$person->insertPerson();

... (operations) ...

$this->commit();

}

catch (\PDOException $e) {

$this->rollback();

}

}

}

$sellCar = new CarOwnerData();

$sellCar->createOwner();

UPDATE1:静态属性$warn_rollback_was_thrown已添加到TransactionController,以警告事务在执行的某个时刻失败,但没有回滚.

UPDATE2:当事务在某个时刻失败时,您可以使用forceRollback()让代码仍然运行到最后或最终停止它,例如,请参见以下代码:

public function insertMultiplePersons( $arrayPersons )

{

try {

$this->beginTransaction();

if (is_array( $arrayPersons )) {

foreach ($arrayPersons as $k => $person) {

$this->insertPerson( $person );

if ($this->transactionFailed()) {

$this->forceRollback();

}

}

}

$this->commit();

}

catch (\PDOException $e) {

$this->rollback();

}

} ?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美智库:马赛克战是人工智能与自主系统支撑的决策中心战

来源:国防科技要闻编者按2020年2月11日,美战略与预算评估中心发布报告《马赛克战:利用人工智能和自主系统实施决策中心战》。针对大国战略竞争,报告建议美国防部摒弃当前以消耗战为中心的理念,采用决策中心战。报告分析…

echarts山东地图_用 Python 绘制个人足迹地图

前两年,足迹地图小程序风靡朋友圈,一时间大家都流行晒自己的旅行地图。但是,笔者最近体验了好几款足迹地图的小程序,发现这些小程序虽然号称是足迹地图,但最多只是展示到省级别,无法精确到市级别&#xff0…

VC/VS开发问题集锦

(1)如何在一个CString的字符串中,以","为分割点,提取子字符串 CString a"322,787,123";int na.Find(","); //查找第一个","的位置ba.left(n); //将","左边的值取出给bint lengtha.…

AI 芯片发展的前世今生

来源:《微纳电子与智能制造》期刊作者:任 源、潘 俊、刘京京、何燕冬、何 进现代电子产品和设备在诸如通信 、娱乐 、安全和医疗保健等许多方面改善了我们的生活质量 ,这主要是因为现代微电子技术的发展极大地改变了人们的日常工作和互动方式…

用户解锁不存在_苹果推送iOS 13.5测试版,戴口罩解锁更顺畅

目前最新的 iOS 系统正式版为 13.4.1,之前苹果已经开始 iOS 13.4.5 的测试工作,并于 4 月 16 日推送了 Beta2 版本。令人意外的是,今日凌晨苹果为参与测试的设备直接推送了 iOS 13.5 的测试版更新,而且是 Beta3 版本(「iOS 13.5 B…

io系列之字节流

java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看。 本篇为此系列随笔的第一篇:io系列之字节流。 一、字节流的File读写操作。 InputStream and OutputStream 一…

shell for循环1到100_浅谈Linux下shell 编程的for循环常用的6种结构

浅谈Linux下shell 编程的for循环常用的6种结构1、 常用for循环结构(1)for 变量 in 值1 值2 值3...do程序块儿done(2)for 变量 in 命令 (或者$())do程序块儿done(3)for 变量 in {1..100}do程序块儿done(4)for 变量 in "$"do程序块儿done(5)for 变量 in /etc/*.confdo程…

案例163:基于微信小程序的校园二手交易平台系统设计与开发

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...

来源:专知【导读】生成式对抗网络(Generative Adversarial Networks,GANs)作为近年来的研究热点之一,受到了广泛关注,每年在机器学习、计算机视觉、自然语言处理、语音识别等上大量相关论文发表。密歇根大学…

201521123035《Java程序设计》第八周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容。 1.2 选做:收集你认为有用的代码片段 //泛型方法,打印MyStack的所有元素的薪水,不管MyStack中的元素是Employee类型或者Employee的子…

x79主板bios设置详解_BIOS(主板)常用功能:设置启动磁盘

BIOS是什么?BIOS是英文"Basic Input Output System"的缩写,翻译成中文名称就是"基本输入输出系统"。BIOS是个人电脑启动时加载的第一个软件,是连接电脑硬件和软件的枢纽,有多重要就不言而喻了吧!B…

mysql内部实现原理面试_理解完这些基本上能解决面试中MySql的事务问题

事务是指逻辑上的一组操作,要么都执行,要么都不执行,事务的特性(ACID)原子性(Atomicity):事务是不可分割的工作单元,要么都成功,要么都失败, 如果事务中一个sql语句执行失败,则已执行的语句也必…

《自然-神经科学》发表脑智卓越中心关于昼夜节律中枢的研究成果

来源:脑智卓越中心昼夜节律在生物体中广泛存在,对调节人们一天之中的运动、睡眠、代谢等诸多生理过程起着重要的作用。目前认为哺乳动物的昼夜节律是由位于大脑中的视交叉上核(Suprachiasmatic Nucleus, SCN)控制的。SCN能够接收视…

mybatis 打印sql_mybatis-plus 3.1.0 发布,划重点一大波升级

mybatis-plus 是一款 Mybatis 动态 SQL 自动注入 Mybatis 增删改查 CRUD 操作中间件, 减少你的开发周期优化动态维护 XML 实体字段,无入侵全方位 ORM 辅助层让您拥有更多时间吃鸡、陪家人、陪朋友。更新日志升级 mybatis 到 3.5.0 版本升级 mybatis-spri…

201521123059 《Java程序设计》第八周学习总结

1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结集合与泛型相关内容。 1.2 选做&#xff1a;收集你认为有用的代码片段 简单泛型定义&#xff1a; public class Pair<T> {public Pair(T first, T second) {this.first first; this.…

mysql driver 读写分离_Mysql主从复制和读写分离实践

1、主从复制原理MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后&#xff0c;其作为master&#xff0c;它的数据库中所有操作都会以“事件”的方式记录在二进制日志中&#xff0c;其他数据库作为slave通过一个I/O线程与主服务…

二十世纪最伟大的10大算法

来源&#xff1a;数学中国发明十大算法的其中几位算法大师1、1946 蒙特卡洛方法[1946: John von Neumann, StanUlam, and Nick Metropolis, all at the Los Alamos Scientific Laboratory, cook upthe Metropolis algorithm, also known as the Monte Carlo method.]1946年&…

mybatis 动态字段与表中不一样_8.mybatis的基本工作流程(2.0)※

mybatis的基本工作流程1.读取配置文件&#xff0c;配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。2.有了这些信息就能创建SqlSessionFactory&#xff0c;SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡3.SqlSessionFactory建…

题目填坑计划

一个蒟蒻的最后的挣扎 吉林 JLOI 2016 侦察守卫 树形DP 可怕的题目&#xff0c;照题解抄了一遍&#xff0c;和它相似的题目还有HDU5290BombingPlan 方 容斥乱搞 可怕的题目&#xff0c;看题解懂的&#xff0c;但是完全写不来 成绩比较 组合DP 找题解理解了并且做完了&#xff0…

判断表达式值是否为空_如何在 Python 中判断列表是否为空

在判断列表是否为空时&#xff0c;你更喜欢哪种方式&#xff1f;决定因素是什么&#xff1f;在 Python 中有很多检查列表是否是空的方式&#xff0c;在讨论解决方案前&#xff0c;先说一下不同方法涉及到的不同因素。我们可以把判断表达式可以分为两个阵营&#xff1a;对空列表…