基于SSM的事务

1.1 准备工作

在Spring的XML配置文件中必须配置TransactionManager和注解驱动:

1
2
3
4
5
6
7
8
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 以下ref引用到的是数据库连接池的Bean对象 -->
<property name="dataSource" ref="dataSource" />
</bean>

<!-- 以下配置的transaction-manager是以上Bean的id -->
<tx:annotation-driven transaction-manager="transactionManager" />

1.2 使用事务

应该保证在Service中存在与DAO/Mapper中对应的方法,即在DAO/Mapper中有什么方法,在Service中就存在直接调用它们的方法。

当某个方法需要以事务的方式执行,则可以使用@Transactional进行注解,则在这个方法执行的所有数据库的增删改操作都会以事务的方式执行,即一系列的操作将整体成功,或整体失败!

关于@Transactional注解,还可以用于注解整个类,则这个类中所有的方法都会以事务的方式执行,当然,这种做法是不推荐的!原因有:a)并不是所有方法都需要是以事务的方式执行的,例如单条增删改的操作,或者查询的操作;b)该注解还可以做其它配置,每个方法的配置可以不同!

最后,Spring也严重不推荐使用@Transactional对接口或抽象方法进行注解!

1.3 事务的传播特性

在使用@Transactional注解时,可以配置注解参数,其中,propagation参数就是用于配置其传播特性的!语法为:

1
@Transactional(propagation=TransactionDefinition.PROPAGATION_SUPPORTS)
1
transaction 事务 propagation 传播  Definition 定义

该配置的属性取值为枚举值,推荐使用TransactionDefinition中以PROPAGATION_作为前缀的常量,取值有:

1
2
3
4
5
6
7
PROPAGATION_REQUIRED
PROPAGATION_SUPPORTS
PROPAGATION_MANDATORY
PROPAGATION_REQUIRES_NEW
PROPAGATION_NOT_SUPPORTED
PROPAGATION_NEVER
PROPAGATION_NESTED

如果没有配置propagation,则默认值是PROPAGATION_SUPPORTS,表示支持事务,当原本存在事务时,当次的执行将加入到事务中。

以上各PROPAGATION_值的意义可参考TransactionDefinition的注释,或查阅资料。

1.4 小结

如果需要使用事务,先在Spring的XML文件中配置。

在编写Service类时,应该创建与DAO/Mapper中匹配所有方法,与其保持一致!然后,当需要以事务的方法执行时,另使用某个方法调用Service自身的方法来执行,同时,使用@Transactional进行注解!

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信