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


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

 

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

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


 

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

 

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

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

  

然后我开启了事务:

 

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

 

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

 


 

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

 

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

 

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

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

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM