mysql 多个表 事务回滚_mysql事务可以一次回滚多个库里的多张表么

本文介绍了在PHP Zend框架中遇到的MySQL事务回滚问题。作者原本期望在一个事务中对不同数据库的多张表进行操作,如果其中一步失败则全部回滚。然而,由于Zend框架的PDO封装方式,导致了事务无法正确回滚跨库操作。解决方案是使用支持跨库的连接方式或引入MySQL Proxy来避免过多的数据库连接。
摘要由CSDN通过智能技术生成

这次不按照以前的风格写了

大背景就是,我写了一段大逻辑,会依次往产品库的产品表里添加数据记录,往订单库的待付费订单表添加待付费记录,往协议库的协议表添加协议签署记录

然后每一步都可能失败,我期望只要有其中一个失败,就把所有的都回滚掉。

尴尬的是,我在php的Zend代码逻辑里,只回滚了一张表,这就尴尬了,难道mysql的事务只能在同一个数据库中操作么?

其实不然,特意在mysql的客户端中尝试了下:

先查询,在两个库中的两张表中如下两条记录,

20191211214713410497.png

然后我开启了事务:

20191211214714253216.png

之后执行了对上面两条记录的删除操作,之后就行回滚

20191211214714485623.png

再次查询,发现上面的两条记录都回来了,也就是说,mysql事务的回滚是支持跨库跨表的。

那我的代码里写的事务咋就不行了呢?

原来是以为代码进行db连接是通过pdo实现的,然后在Zend里面对pdo进行了封装,每一个pdo对象是一个 host + port + database;

实际上,我们在客户端执行的时候,连接对象就是host + port ,而且pdo本身也支持host + port ,不知什么原因,zend里就偏偏封装的时候加了database, 这样只要涉及到跨库,就没法回滚了。

这样还引入了一个坏处,就是如果我们有大量的db操作,这些操作会访问同一个集群的不同的库,则会多出非常多的连接了,这也就是之前我们频繁报mysql连接数超了的原因了,

在没法修改底层Zend pdo连接建立的情况下,就只能多增加mysql 的 proxy,多一个host + port

原文:https://www.cnblogs.com/liuyong18/p/12025168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值