PHP行列场景以及实现代码实例详解

为了低落单点压力,凡是会按照业务环境举办分表分库,将表漫衍在差异的库中(库大概漫衍在差异的呆板上),可是一个业务场景大概会同时处理惩罚两个表的操纵。在这种场景下,事务的提交会变得相对巨大,因为多个节点(库)的存在,大概存在部门节点提交失败的环境,即事务的ACID特性需要在各个差异的数据库实例中担保。好比更新db1库的A表时,必需同步更新db2库的B表,两个更新形成一个事务,要么都乐成,要么都失败。

那么我们如何操作mysql实现漫衍式数据库的事务呢?

mysql是从5.0开始支持漫衍式事务

这里先声明两个观念:

资源打点器(resource manager):用来打点系统资源,是通向事务资源的途径。数据库就是一种资源打点器。资源打点还应该具有打点事务提交或回滚的本领。
事务打点器(transaction manager):事务打点器是漫衍式事务的焦点打点者。事务打点器与每个资源打点器(resource
manager)举办通信,协调并完成事务的处理惩罚。事务的各个分支由独一定名举办标识。
mysql在执行漫衍式事务(外部XA)的时候,mysql处事器相当于xa事务资源打点器,与mysql链接的客户端相当于事务打点器。

漫衍式事务道理:分段式提交
漫衍式事务凡是回收2PC协议,全称Two Phase Commitment Protocol。该协议主要为了办理在漫衍式数据库场景下,所有节点间数据一致性的问题。漫衍式事务通过2PC协议将提交分成两个阶段:

prepare;commit/rollback

阶段一为筹备(prepare)阶段。即所有的参加者筹备执行事务并锁住需要的资源。参加者ready时,向transaction manager陈诉已筹备停当。
阶段二为提交阶段(commit)。当transaction manager确认所有参加者都ready后,向所有参加者发送commit呼吁。

事务协调者transaction manager
因为XA 事务是基于两阶段提交协议的,所以需要有一个事务协调者(transaction manager)来担保所有的事务参加者都完成了筹备事情(第一阶段)。假如事务协调者(transaction manager)收到所有参加者都筹备好的动静,就会通知所有的事务都可以提交了(第二阶段)。MySQL 在这个XA事务中饰演的是参加者的脚色,而不是事务协调者(transaction manager)。

Mysql的XA事务分为外部XA和内部XA

外部XA用于跨多MySQL实例的漫衍式事务,需要应用层作为协调者,通俗的说就是好比我们在PHP中写代码,那么PHP书写的逻辑就是协调者。应用层认真抉择提交照旧回滚,瓦解时的悬挂事务。MySQL数据库外部XA可以用在漫衍式数据库署理层,实现对MySQL数据库的漫衍式事务支持,譬喻开源的署理东西:网易的DDB,淘宝的TDDL等等。

内部XA事务用于同一实例下跨多引擎事务,由Binlog作为协调者,好比在一个存储引擎提交时,需要将提交信息写入二进制日志,这就是一个漫衍式内部XA事务,只不外二进制日志的参加者是MySQL自己。Binlog作为内部XA的协调者,在binlog中呈现的内部xid,在crash recover时,由binlog认真提交。(这是因为,binlog不举办prepare,只举办commit,因此在binlog中呈现的内部xid,必然可以或许担保其在底层各存储引擎中已经完成prepare)。

mysql xa事务的语法

1、首先要确保mysql开启XA事务支持

SHOW VARIABLES LIKE '%xa%'

假如innodb_support_xa的值是ON就说明mysql已经开启对XA事务的支持了。 假如不是就执行:

SET innodb_support_xa = ON

主要有:

XA START 'any_unique_id'; // 'any_unique_id' 是用户给的,全局独一在一台mysql中开启一个XA事务 XA END 'any_unique_id '; //标识XA事务的操纵竣事 XA PREPARE 'any_unique_id'; //奉告mysql 筹备提交这个xa事务 XA COMMIT 'any_unique_id'; //奉告mysql提交这个xa事务 XA ROLLBACK 'any_unique_id'; //奉告mysql回滚这个xa事务 XA RECOVER;//查察本机mysql今朝有哪些xa事务处于prepare状态

XA事务规复
假如执行漫衍式事务的mysql crash了,mysql 凭据如下逻辑举办规复:
a. 假如这个xa事务commit了,那么什么也不消做
b. 假如这个xa事务还没有prepare,那么直接回滚它
c. 假如这个xa事务prepare了,还没commit, 那么把它规复到prepare的状态,由用户去抉择commit或rollback
当mysql crash后从头启动之后,执行“XA RECOVER;”查察当前处于prepare状态的xa事务,然后commit或rollback它们。

利用限制
a. XA事务和当地事务以及锁表操纵是互斥的
开启了xa事务就无法利用当地事务和锁表操纵

mysql> xa start 't1xa'; Query OK, 0 rows affected (0.04 sec) mysql> begin; ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state mysql> lock table t1 read; ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state

开启了当地事务就无法利用xa事务

mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> xa start 'rrrr'; ERROR 1400 (XAE09): XAER_OUTSIDE: Some work is done outside global transaction

b. xa start 之后必需xa end, 不然不能执行xa commit 和xa rollback

所以假如在执行xa事务进程中有语句堕落了,你也需要先xa end一下,然后才气xarollback。

留意事项

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdspz.html