问题1:为什么seata中,执行到这个断点的时候 , 我去数据库里查看已经数据被更改了, 但是从日志上看还没有打印出分支事务提交? 分支异步提交的话, 我在断点上停到全局事务回滚也没看到 分支事务提交的打印日志。 但在数据库里面看到了数据被修改。 这个情况是否正常? 1 是我的代码配置有问题,要手工设置 connection.setAutoCommit(false);? 2还是说这个情况属于正常的?但本地提交日志应该打印出来,观察不到,比较迷惑。 问题2:具体怎么控制 把哪些sql 在一个本地分支事务里?
Seata 采用异步提交分支事务的方式,所以在您打印日志的时候,可能还没有执行提交分支事务的操作。您可以等待一段时间,再查看日志是否有打印出分支事务提交的信息。
如果您在代码中手工设置了 connection.setAutoCommit(false),那么需要在代码中手工提交事务,否则数据会被更改,但事务不会被提交。您可以检查一下您的代码中是否有手工设置 connection.setAutoCommit(false) 的操作,并确认是否手工提交了事务。
如果您确认数据已经被更改了,但是日志中没有打印出分支事务提交的信息,那么可能是日志配置有问题。您可以检查一下日志配置是否正确,并尝试调整日志级别,查看是否能够打印出更多的日志信息。
问题1:这种情况可能是由于 Seata 的配置问题导致的。在 Seata 中,分支事务提交需要通过日志记录来实现,如果没有正确配置日志记录,就会导致分支事务提交失败。
首先,你需要确认你的 Seata 配置文件中是否正确配置了日志记录相关的参数,例如 file.storage-type
、file.storage-path
、file.max-size
等。这些参数用于指定日志存储的位置和大小限制等。
其次,你需要确认你的数据库连接是否正确配置了事务隔离级别为可重复读(REPEATABLE READ),因为 Seata 需要保证分支事务提交时数据不会被其他事务修改。你可以在数据库连接字符串中添加 isolation=REPEATABLE READ
参数来设置事务隔离级别。
最后,你需要确认你的代码是否正确使用了 Seata 提供的 API 来进行分支事务的提交。具体来说,你需要在每个分支事务开始前调用 GlobalTransactionContext.begin()
方法来创建一个全局事务上下文,然后在每个分支事务结束时调用 GlobalTransactionContext.commit()
方法来提交分支事务。如果你的代码没有正确使用这些 API,就可能导致分支事务提交失败。
关于你的问题2,Seata 支持将多个 SQL 语句放在同一个本地分支事务中进行提交。你可以通过在每个 SQL 语句前调用 GlobalTransactionContext.begin()
方法来创建一个新的本地事务上下文,并在该上下文中执行所有的 SQL 语句。在所有 SQL 语句执行完毕后,再调用 GlobalTransactionContext.commit()
方法来提交本地事务。这样就可以将多个 SQL 语句放在同一个本地分支事务中进行提交了。
回答1:接入的不对,自己去看shardingsphere社区的sample。去看他们提供的,seata被他们被动集成。 回答2:那个代码就有问题,自行学习动态代理,隐式this调用,切面失效。此回答整理自钉群“3群-Seata 开源讨论群”。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。