这是我参与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