seata整合springboot项目
# 引入starter
参考官方推荐方式: Seata部署指南 (opens new window)
<!--seata与spring boot starter-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>${seata.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 分析自动装配
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
io.seata.spring.boot.autoconfigure.SeataPropertiesAutoConfiguration,\
io.seata.spring.boot.autoconfigure.SeataDataSourceAutoConfiguration,\
io.seata.spring.boot.autoconfigure.SeataAutoConfiguration,\
io.seata.spring.boot.autoconfigure.HttpAutoConfiguration
2
3
4
5
6
@ConditionalOnProperty(prefix = SEATA_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
public class SeataAutoConfiguration {}
2
SeataProperties: seata.enabled=false 可以关闭seata
注入GlobalTransactionScanner的条件:springApplicationContextProvider、failureHandler
默认TxServiceGroup的前缀:
${spring.application.name}-seata-service-group
如 cloud-api-order-seata-service-group
@ConditionalOnBean(DataSource.class)
@ConditionalOnExpression("${seata.enable:true} && ${seata.enableAutoDataSourceProxy:true} && ${seata.enable-auto-data-source-proxy:true}")
public class SeataDataSourceAutoConfiguration {}
2
3
注入了SeataAutoDataSourceProxyCreator、SeataDataSourceBeanPostProcessor
# 坑:
# 数据源被seata进行了代理,rebel的坑
如果项目以jrebel启动,jrebel会生成代理对象,seata又加了一层代理,因此启动时会出现以下异常。是说没有advised这个字段
Caused by: java.lang.NoSuchFieldException: advised
at java.lang.Class.getDeclaredField(Class.java:2070) ~[na:1.8.0_291]
at io.seata.spring.util.SpringProxyUtils.getAdvisedSupport(SpringProxyUtils.java:91) ~[seata-all-1.4.2.jar:1.4.2]
at io.seata.spring.util.SpringProxyUtils.findInterfaces(SpringProxyUtils.java:59) ~[seata-all-1.4.2.jar:1.4.2]
at io.seata.spring.annotation.GlobalTransactionScanner.wrapIfNecessary(GlobalTransactionScanner.java:257) ~[seata-all-1.4.2.jar:1.4.2]
... 34 common frames omitted
2
3
4
5
6
原因分析:
这是因为反射时找不到字段而报出,seata1.4.2中io.seata.spring.util.SpringProxyUtils#findTargetSpringClass中获取代理对象的方法targetSource.getTargetClass()引起的。
在1.4.1 之前,对于TargetSource这个对象, 认为就是静态对象,所以直接取的targetSource.getTargetClass()
在1.4.2版本,又完全认为是一个动态对象,而这里的问题就是获取一个被代理的动态对象时,实际上是不能获取这个对象的, 只能获取这个对象的类型.
解决办法:
- 不要用jrebel启动,因为他会创建一个代理对象,请读源码:
SpringProxyUtils
里面的getAdvisedSupport()方法
seata 踩坑记录_流离岁月的博客-CSDN博客 (opens new window)
# jpa自增的坑
jpa自增,是依靠数据库表hibernate_sequence
获取下一个id值,以确保当前数据库的所有表id唯一。 seata开启全局事务,会报Failed to fetch schema of hibernate_sequence
异常
解决办法:
- 修改主键生成策略,默认为@GeneratedValue auto, 修改成 @GeneratedValue(strategy=GenerationType.IDENTITY) 按表的自增字段进行自增
# 序列化问题
修改seata的换序列化方式 配置中心中配置client.undo.logSerialization=kryo
,默认为jackson
,client端再引入kryo的依赖包
<dependency>
<groupId>com.esotericsoftware.kryo</groupId>
<artifactId>kryo</artifactId>
<version>2.24.0</version>
</dependency>
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>5.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.esotericsoftware/kryo-shaded -->
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo-shaded</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>de.javakaffee</groupId>
<artifactId>kryo-serializers</artifactId>
<version>0.45</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
日期格式,默认0000用datetime格式时会反序列化出错,用timestamp
时,就没有出错。 hibernate注解:@CreationTimestamp
@UpdateTimestamp
//@CreatedDate
@Column(name="create_time",columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@CreationTimestamp
private Date createTime;
//@LastModifiedDate
@
b'v\是、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、20000000000000000000000000000000000000000000000000000000000000000000.、 .0 0.
@Column(name="update_time",columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private Date updateTime;
2
3
4
5
6
7
8
9
10
记seata集成nacos序列化异常问题 - luckyangg - 博客园 (cnblogs.com) (opens new window)
参考文章: