dubbo中使用事务

1、导入依赖

<dependency>
  <groupId>mysqlgroupId>
  <artifactId>mysql-connector-javaartifactId>
  <version>5.1.47version>
dependency>
<dependency>
  <groupId>com.alibabagroupId>
  <artifactId>druidartifactId>
  <version>1.1.6version>
dependency>
<dependency>
  <groupId>org.mybatisgroupId>
  <artifactId>mybatis-springartifactId>
  <version>1.3.2version>
dependency>

2、在spring配置文件中配置数据源和数据库管理器并开启事务控制的注解驱动


    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test" />
    bean>
    
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    bean>
    
    <tx:annotation-driven transaction-manager="transactionManager"/>

3、在Service层加Transaction注解

事务的实现是有aop自动生成的,有两种代理方式:1.JDK动态代理 2.CGLIB动态代理
dubbo中使用事务_第1张图片

3.1、当写的Service曾出现接口时默认时JDK动态代理,aop会自动生成Service的代理类,这个生成的代理类不在我们自己写的包下,然而JDK动态代理会扫描同一包,发现同一包下没有Service的代理类,于是会报一个没有找到提供者的异常。
所以解决方法是不使用JDK动态代理,而是使用CGlib的动态代理
解决方法:
1)、在spring的配置文件中的开启事务控制的注解支持的配置中加上 proxy-target-class=“true”
2)、并且在Service层的注解@Transaction加上interfaceClass=当前Service类的字节码 即可。


    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
@Transactionl(interfaceClass = UserServiceImpl.class)
public void UserServiceImpl implements UserService{}

你可能感兴趣的:(dubbo)