1. seata的一些扩展
1.1 对变更表结构(如增加字段)的扩展支持
seata
会对表的结构,有一个缓存机制,默认的时间为10分钟!!!
如果我们对表的结构进行了修改,那这里会导致seata异常,事务无法提交,导致报错。
解决方案办法如下:
1.等待10分钟后再操作。
2.对源码进行修改,不再从缓存获取表结构。
哈哈,我们作为一个程序员
,那肯定是选择2
呀!!!
因此,需对源码进行修改。在rm-datasource
(seata-rm-datasource)\src\main\java 目录下,对io.seata.rm.datasource.sql.struct.TableRecords
类进行修改,如下图所示:
对buildRecords方法里面的相关代码进行微调,columnName
以及dataType
不再从缓存的表结构TableMeta获取,改从ResultSetMetaData中获取。
1.2 对多表关联更新的扩展支持
有时候,我们进行更新操作的时候,可能需要联表进行更新,例如下面的sql
:
update product a, product_detail b set a.name='测试seata' where a.id=b.product_id and b.user_name='llsydn'
但是这样的sql语句,使用了seata事务,会导致seata事务提交不了,而导致报错。
seata
默认不支持多表关联更新
,这里,我们需对源码进行修改。
在rm-datasource
(seata-rm-datasource)\src\main\java 目录下,对io.seata.rm.datasource.exec.UpdateExecutor
类进行修改,如下图所示:
1.2.1 mysql数据库
在sqlparser
(seata-sqlparser)的子模块seata-sqlparser-druid\src\main\java 目录下,对io.seata.sqlparser.druid.mysql.MySQLUpdateRecognizer类进行修改,如下图所示:
1.2.2 oracle、kingbase(人大金仓)以及达梦数据库
(1)在sqlparser
(seata-sqlparser)的子模块seata-sqlparser-druid\src\main\java 目录下,对io.seata.sqlparser.druid.oracle.OracleUpdateRecognizer
类进行修改,如下图所示:
(2)在sqlparser
(seata-sqlparser)的子模块seata-sqlparser-druid\src\main\java 目录下,对io.seata.rm.datasource.undo.oracle.keyword.OracleKeywordChecker
类进行修改,如下图所示:
1.2.3 多表关联更新SQL语句样例
(1)mysql数据库:
普通多表连接
update product a, product_detail b set a.name='测试seata' where a.id=b.product_id and b.user_name='llsydn'
join table
update order a join order_detail b on a.id=b.order_id set a.total=1998 where b.user_name='llsydn'
(2)oracle、kingbase(人大金仓)以及达梦数据库:
update product a, product_detail b set a.name='测试seata' where a.id=b.product_id and b.user_name='llsydn'
好了,seata的一些扩展,seata源码修改,就到这里了!!!
今天就先到这里了,溜了溜了溜了!!!^_^
觉得有收获的,帮忙点个赞
呗!!!
原文:https://juejin.cn/post/7103154855786741774