这次不按照以前的风格写了
大背景就是,我写了一段大逻辑,会依次往产品库的产品表里添加数据记录,往订单库的待付费订单表添加待付费记录,往协议库的协议表添加协议签署记录
然后每一步都可能失败,我期望只要有其中一个失败,就把所有的都回滚掉。
尴尬的是,我在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