Spring事务管理
来源:互联网 发布:outdoor products 淘宝 编辑:程序博客网 时间:2024/06/10 14:42
事务是数据库中的概念,spring支持两种方式的事务管理:
编程式,声明式。
1. 事务中的API介绍
主要是3个接口,
- PlatformTransactionManager事务管理器
Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现,就是提供该接口来实际的管理数据库。 - TransactionDefinition事务定义信息(隔离级别,传播,超时时间,只读)
- TransactionStatus事务具体运行状态(是否提交等)
具体内容可以参考Spring手册。
总的来说就是:PlatformTransactionManager根据PlatformTransactionManager中的定义来管理事务,管理状态保存到TransactionStatus中。
2. 编程式实现
spring提供了一个事务管理的模板,只需要将事务管理器引入到该模板即可:在xml文件中
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务管理模板:spring为了简化事务管理的代码而提供的类 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"></property> </bean>
在service层的类中:
@Override public void transfer(final String out, final String in, final int money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { accountDao.out(out, money); int i = 1/0; accountDao.in(in, money); } }); }
3. 声明式实现
声明式的事务管理,又分为3种
- 基于TransactionProxyFactoryBean的方式,该方法有个缺点:一次声明只能对一个目标进行增强,不利于维护,因此不常用。
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置业务层的代理 --> <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置目标对象 --> <property name="target" ref="accountService"></property> <!-- 注入事务管理器 --> <property name="transactionManager" ref="transactionManager"></property> <!-- 注入事务的属性 --> <property name="transactionAttributes" > <!-- 用props注入Properties类型对象 --> <props> <!-- prop的格式 * PROPAGATION : 事务的传播行为 * ISOLATION : 事务的隔离级别 * readOnly : 只读(不能进行修改,删除) * -Exception : 发生哪些异常事务回滚 * +Exception : 发生哪些异常事务不回滚 --> <prop key="transfer">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> </props> </property> </bean>
- 基于AspectJ的xml方式:AspectJ是一个AOP开发框架,用AspectJ的优点是在业务类上不需要添加任何其他注解
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务的通知:(事务的增强) --> <tx:advice id="txAdvice" transaction-manager="transactionManager" > <tx:attributes> <!-- propagation : 事务传播行为 isolation : 事务隔离级别 read-only rollback-for no-rollback-for timeout --> <tx:method name="transfer" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 配置AOP的切面 --> <aop:config> <!-- 配置切入点 --> <aop:pointcut expression="execution(* demo3.AccountService+.*(..))" id="pointcut1"/> <!-- 配置切面 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>
- 基于注解的方式,在xml文件配置开启注解事务即可,配置简单,但需要在哦业务层类上添加@Transactional注解
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>
在业务层类上:
@Transactional(propagation=Propagation.REQUIRED)public class AccountServiceImpl implements AccountService{
总结一下AOP的基本过程:
配置增强方式—->找到切入点——>在切入点定义切面
0 0
- 事务管理之Spring事务管理
- Spring事务管理
- spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring 事务管理
- Spring事务管理
- spring 事务管理
- spring 事务管理
- spring 事务管理
- spring事务管理
- Spring 事务管理
- Spring事务管理
- spring事务管理
- spring 事务管理
- cadence软件命令使用小结
- 类的大小
- LightOJ 1331(数学计算几何)
- java 初学
- 多线程中并发问题
- Spring事务管理
- windows 、linux 下 多个静态库合并成一个静态库
- LightOJ1282 Leading and Trailing 大数取首尾
- OpenCV与Socket实现树莓派获取摄像头视频至电脑
- 从尾到头打印链表
- java list 迭代中能否删除?
- MacbookPro OS X EI Captain下编译Chrome源代码
- Python爬虫之高清壁纸下载
- python正则表达式re模块详细介绍