Algumas extensões do seata, modificação do código-fonte do seata

Continue a criar, acelere o crescimento! Este é o 5º dia da minha participação no "Nuggets Daily New Plan · June Update Challenge", clique para ver os detalhes do evento

1. Algumas extensões de seata

1.1 Suporte estendido para alterar a estrutura da tabela (como adicionar campos)

seataExiste um mecanismo de cache para a estrutura da tabela, e o tempo padrão é de 10 minutos! ! !

Se modificarmos a estrutura da tabela, isso causará uma exceção de assento, a transação não poderá ser confirmada e um erro será relatado.

A solução é a seguinte:

1. Aguarde 10 minutos antes de operar.

2. Modifique o código-fonte e não obtenha mais a estrutura da tabela do cache.

Haha, como um de nós 程序员, isso deve ser uma escolha 2! ! !

Portanto, o código-fonte precisa ser modificado. No rm-datasourcediretório (seata-rm-datasource)\src\main\java, modifique a classe io.seata.rm.datasource.sql.struct. TableRecords, conforme mostrado na figura a seguir:

imagem.png

Ajuste o código relevante no método buildRecords columnNamee dataTypenão o obtenha mais da estrutura de tabela em cache TableMeta, mas obtenha-o de ResultSetMetaData.

1.2 Suporte estendido para atualização de associação de várias tabelas

Às vezes, quando realizamos uma operação de atualização, podemos precisar atualizar a tabela, como o seguinte sql:

update product a, product_detail b set a.name='测试seata' where a.id=b.product_id and b.user_name='llsydn'
复制代码

No entanto, tal instrução SQL, usando uma transação seata, fará com que a transação seata não seja enviada, resultando em um erro.

seataNão é suportado por padrão 多表关联更新. Aqui, precisamos modificar o código-fonte.

No rm-datasourcediretório (seata-rm-datasource)\src\main\java, modifique a classe io.seata.rm.datasource.exec. UpdateExecutor, conforme mostrado na figura a seguir:

imagem.png

imagem.png

imagem.png

1.2.1 banco de dados MySQL

No sqlparserdiretório do submódulo seata-sqlparser-druid\src\main\java de (seata-sqlparser), modifique a classe io.seata.sqlparser.druid.mysql.MySQLUpdateRecognizer, conforme mostrado na figura a seguir:

imagem.png

1.2.2 oráculo, base do rei (Congresso Nacional do Povo Jincang) e banco de dados Dameng

(1) No sqlparserdiretório do submódulo seata-sqlparser-druid\src\main\java de (seata-sqlparser), OracleUpdateRecognizermodifique a classe io.seata.sqlparser.druid.oracle., conforme mostrado na figura a seguir:

imagem.png

(2) No sqlparserdiretório do submódulo seata-sqlparser-druid\src\main\java de (seata-sqlparser), OracleKeywordCheckermodifique a classe io.seata.rm.datasource.undo.oracle.keyword., conforme mostrado na figura a seguir:

imagem.png

1.2.3 Exemplo de instrução SQL de atualização de associação de várias tabelas

(1) banco de dados mysql:

Junção comum de várias tabelas

update product a, product_detail b set a.name='测试seata' where a.id=b.product_id and b.user_name='llsydn'
复制代码

juntar mesa

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 (Congresso Nacional do Povo Jincang) e banco de dados Dameng:

update product a, product_detail b set a.name='测试seata' where a.id=b.product_id and b.user_name='llsydn'
复制代码

Bem, algumas extensões do seata, modificação do código fonte do seata, é isso! ! !

Estou aqui primeiro hoje, skimming, skimming! ! ! ^_^

Se você achar útil, por favor, ajude 点个赞! ! !

imagem.png

おすすめ

転載: juejin.im/post/7103154855786741774