在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
今天让我们走进声明式事务控制的学习,具体内容包括编程式事务控制相关对象,基于 XML 的声明式事务控制以及基于注解的声明式事务控制。对声明式事务控制感兴趣的同学,赶紧一起来看看小编整理的学习笔记吧!
一、编程式事务控制相关对象
1、PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。
2、TransactionDefinition
TransactionDefinition 是事务的定义信息对象,里面有如下方法:
(1)事务隔离级别:设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。
(2)事务传播行为
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)。
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)。
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER:以非事务方式运行,如果当前存在事务,抛出异常。
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作。
超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置。
是否只读:建议查询时设置为只读。
3、TransactionStatus
TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。
二、基于 XML 的声明式事务控制
1、声明式事务控制是什么?
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。它的作用是事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可。而且在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。
2、声明式事务控制的实现
(1)引入tx命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
(2)配置事务增强
<!--平台事务管理器-->
<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>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
(3)配置事务 AOP 织入
<!--事务的aop增强-->
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.itheima.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"></aop:advisor>
</aop:config>
(4)测试事务控制转账业务代码
public void transfer(String outMan, String inMan, double money) {
accountDao.out(outMan,money);
int i = 1/0;
accountDao.in(inMan,money);
}
三、基于注解的声明式事务控制
1、注解配置声明式事务控制
(1)编写 AccoutDao
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void out(String outMan, double money) {
jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);
}
public void in(String inMan, double money) {
jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);
}
}
(2)编写 AccoutService
@Service("accountService")
@Transactional
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public void transfer(String outMan, String inMan, double money) {
accountDao.out(outMan,money);
int i = 1/0;
accountDao.in(inMan,money);
}
}
(3)编写 applicationContext.xml 配置文件
<!—之前省略datsSource、jdbcTemplate、平台事务管理器的配置-->
<!--组件扫描-->
<context:component-scan base-package="com.itheima"/>
<!--事务的注解驱动-->
<tx:annotation-driven/>
以上就是声明式事务控制的学习笔记整理,如果大家还有什么不懂的地方,可以上博学谷报名JavaEE在线就业班,有线上的老师为大家提供一对一的辅导答疑,现在就去体验试听课程吧~
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java基础:char 型变量中能不能存贮一个中文汉字?为什么?
char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,所以,char 型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char 类型的变量也是占用两个字节。
7211
2019-05-23 11:16:51
学习Java好不好?未来发展反向有哪些?
从市场需求来看,Java应用面试非常广泛的,而且是大多数企业级软件开发的首选。就其使用率来看,Java编程语言连续十几年处于所有开发语言的前三位。及时应用市场不断有新的技术涌入,依旧无法撼动Java的地位。所以对于学习Java的小伙伴来说,不要担心学习了Java市场会不好,我们需要更加关注技术层面的优秀。那Java未来的发展方向有哪些呢?
7858
2019-06-14 17:25:35
Java免费视频教程学习来博学谷
Java免费视频教程学习,小编整理了博学谷在线IT培训平台关于Java开发的免费课程,大家可以在线视频学习Java基础的专业知识及Java发展趋势及职业规划等内容,Java免费视频教程主要介绍:Java秒杀系统实战、2小时看清Java未来规划、Java基础语法、JavaEE与人工智能、Springmvc+Mybatis课程。
7834
2019-08-01 16:08:02
参加在线Java培训要多久?Java培训周期是多久?
参加在线Java培训要多久?Java培训周期是多少?很多机构都说4-6个月就可以掌握Java开发技术,是真的吗?在线学习Java和培训机构面授班的Java培训周期一样吗?我们带着诸多的问题,一起来分析一下参加Java培训的学习周期。
5630
2020-07-24 16:24:20
Java开发岗位需求量大吗?市场行情怎么样?
互联网大厂每一次的动作都会带来一股网络热浪,前不久的“反996”如此,最近腾讯推出员工退休待遇方案亦是如此。虽然退休离我们还很远,但是只要关乎福利就是我们关注的事情。
3779
2021-11-10 11:01:57