可能是最详细的Spring事务管理讲解(下)

323 阅读3分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

Spring事务环境搭建实例

举例:购买商品trans_sale项目

本例要实现购买商品,模拟用户下订单,向订单表添加销售记录,从商品表减少库存。

实现步骤:

Step0:创建数据库表

创建两个数据库表sale , goods

sale 销售表

goods 商品表

goods表数据

Step1: maven依赖 pom.xml

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.9</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>
    </dependencies>
<build>
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>

    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
 </build>

Step2:创建实体类

创建实体类Sale与Goods

Step3:定义dao接口

定义两个dao的接口SaleDao , GoodsDao

Step4:定义dao接口对应的sql映射文件

SaleDao.xml

GoodsDao.xml

Step5:定义异常类

定义service层可能会抛出的异常类NotEnoughException

Step6:定义Service接口

定义Service接口BuyGoodsService

Step7:定义service的实现类

定义service层接口的实现类BuyGoodsServiceImpl

● 类定义

● Dao属性

● Buy方法

Step8:修改Spring配置文件内容

  • 声明Mybatis对象

  • 声明业务层对象

Step9:定义测试类

定义测试类MyTest。现在就可以在无事务代理的情况下运行了。

使用Spring的事务注解管理事务

通过@Transactional注解方式,可将事务织入到相应public方法中,实现事务管理。

@Transactional的所有可选属性如下所示:

● propagation:用于设置事务传播属性。该属性类型为Propagation枚举,默认值为Propagation.REQUIRED。

● isolation:用于设置事务的隔离级别。该属性类型为Isolation枚举,默认值为Isolation.DEFAULT。

● readOnly:用于设置该方法对数据库的操作是否是只读的。该属性为boolean,默认值为false。

● timeout:用于设置本操作与数据库连接的超时时限。单位为秒,类型为int,默认值为-1,即没有时限。

● rollbackFor:指定需要回滚的异常类。类型为Class[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。

● rollbackForClassName:指定需要回滚的异常类类名。类型为String[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。

● noRollbackFor:指定不需要回滚的异常类。类型为Class[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。

● noRollbackForClassName:指定不需要回滚的异常类类名。类型为String[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。

需要注意的是,@Transactional若用在方法上,只能用于public方法上。对于其他非public方法,如果加上了注解@Transactional,虽然Spring不会报错,但不会将指定事务织入到该方法中。因为Spring会忽略掉所有非public方法上的@Transaction注解。

若@Transaction注解在类上,则表示该类上所有的方法均将在执行时织入事务。

实现注解的事务步骤:

复制trans_sale项目,新项目trans_sale_annotation

1、声明事务管理器

2、 开启注解驱动

transaction-manager:事务管理器bean的id

3、业务层public方法加入事务属性