1 針對成功事務:
過程說明:
1.初始化連接,路由到各個分片
2.開啟非阻塞執行更新,然后執行時候每個節點執行2次
3.執行提交,各節點返回commit
4.釋放連接,先釋放datasource然后才說非阻塞連接
執行代碼*
#開啟事務更新(全表更新)
mysql> select * from travelrecord;
+----------+-----------+------------+------+------+
| id | user_id | traveldate | fee | days |
+----------+-----------+------------+------+------+
| 1000 | chinesern | 2017-10-11 | 100 | 10 |
| 11000000 | chinesern | 2017-10-11 | 100 | 10 |
| 5100000 | chinesern | 2017-10-11 | 100 | 10 |
+----------+-----------+------------+------+------+
3 rows in set (0.03 sec)
mysql> begin ;
Query OK, 0 rows affected (0.01 sec)
mysql> update travelrecord set user_id='fish';
Query OK, 3 rows affected (0.11 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.03 sec)
分析mycat日志
2 針對失敗事務:
情景描述:
1.一個節點開啟事務SQL執行,不提交
2. mycat 開啟一個事務模擬阻塞,超時后,沖突 手動回滾,並查看mycat日志
rollback過程:
1.獲取連接
2.各個節點執行回滾,釋放非阻塞連接,最后物理連接。
執行代碼*
#在db1執行事務不提交.
[root@localhost bin]# mysql -h 192.168.2.130 -P3306 -u root -proot123
mysql> use db1;
mysql> begin;
mysql>delete from travelrecord where id =1000;
#在mycat里面執行更新,模擬失敗
[root@localhost conf]# mysql -h 192.168.2.130 -P8066 -utest -ptest
mysql> begin;
mysql> update travelrecord set user_id='fail';
ERROR 1105 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> rollback;
分析mycat日志
3 創建存儲過程
#MYCAT上執行報錯
mysql> DELIMITER $$
mysql> CREATE PROCEDURE `proc_count`()
-> BEGIN
-> select count(*) from travelrecord;
-> END$$
ERROR 1064 (HY000): op table not in schema----PROCEDURE
#在各節點上創建存儲
mysql> use db1
mysql> DELIMITER $$
mysql> create procedure proc_select() begin declare i int; select count(*) into i from travelrecord;select i;end$
mysql> use db2
mysql> create procedure proc_select() begin declare i int; select count(*) into i from travelrecord;select i;end$
mysql> use db3
mysql> create procedure proc_select() begin declare i int; select count(*) into i from travelrecord;select i;end$
4 MYCAT上調用pror_select ,路由到特定節點上。**
查詢語句
mysql> /*!mycat:sql=select * from travelrecord where ID=1000*/ call proc_select();
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.03 sec)
分析mycat日志
5 MYCAT上調用proc_select 路由到所有節點
查詢語句
mysql> /*!mycat:sql=select * from travelrecord where ID=1000*/ call proc_select();
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.03 sec)
分析MYCAT日志,可以看到 路由到了三個節點上,但是沒有merge,而是分別查詢出來了!