seata的一些扩展,seata源码修改

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

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类进行修改,如下图所示:

image.png

对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类进行修改,如下图所示:

image.png

image.png

image.png

1.2.1 mysql数据库

sqlparser(seata-sqlparser)的子模块seata-sqlparser-druid\src\main\java 目录下,对io.seata.sqlparser.druid.mysql.MySQLUpdateRecognizer类进行修改,如下图所示:

image.png

1.2.2 oracle、kingbase(人大金仓)以及达梦数据库

(1)在sqlparser(seata-sqlparser)的子模块seata-sqlparser-druid\src\main\java 目录下,对io.seata.sqlparser.druid.oracle.OracleUpdateRecognizer类进行修改,如下图所示:

image.png

(2)在sqlparser(seata-sqlparser)的子模块seata-sqlparser-druid\src\main\java 目录下,对io.seata.rm.datasource.undo.oracle.keyword.OracleKeywordChecker类进行修改,如下图所示:

image.png

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源码修改,就到这里了!!!

今天就先到这里了,溜了溜了溜了!!!^_^

觉得有收获的,帮忙点个赞呗!!!

image.png

猜你喜欢

转载自juejin.im/post/7103154855786741774
今日推荐