Spring支持两种方式事务管理:
1.编程式的事务管理
在实际应用中很少使用;通过TransactionTemplate手动管理事务。
2.使用XML配置声明式事务
开发中推荐使用;Spring的声明式事务是通过AOP实现的。
转账小例子环境搭建
第一步:新建数据库
第二步:引入数据库、Spring、c3p0连接池的jar包;在src目录下引入spring的配置文件
第三步:在Spring的配置文件中,配置c3p0连接池
第四步:编写dao,service
接口
dao实现:
Spring提供了一个JDBC的模板类,完成数据库的操作
在dao中注入连接池,连接池会帮助我们创建JDBC的模板类
service的实现:
在service中注入dao
测试:
这时候我们的程序没有进行事务的管理,那么在我们转账的过程中,要是程序出现了异常,就会导致错误:
aaa账户扣钱,但是bbb账户没有加钱
1 编程式事务管理
Spring为我们提供了一个事务模板类,来管理事务
第一步:在Spring的配置文件中配置事务管理器和事务模板类
将事务管理器注入到事务模板类中
第二步:在service中注入事务模板类
第三步:在service中使用事务模板类创建事务
2 声明式事务管理
该方法是基于AOP实现的,要引入AOPjar包
2.1 基于TransactionProxyFactoryBean的方式
第一步:配置事务管理器
第二步:为service类配置事务代理类
让这个代理类来接管Service,相当于这个代理类是在原来的service的基础上加入了事务管理的一个类。
Props中定义的是事务的属性。
Key代表的是设置哪个方法的事务属性:
Key的值可以是,1.*代表全部方法;2.save*,update*;3.方法全名
第三步:在测试的时候,注入的应该是增强后的service--也就是代理类
附:设置其他事务属性
设置事务只读,那么在这个事务中如果出现修改、插入、删除的操作,就会报异常
设置事务出现哪些异常不回滚,即出现该异常,事务照常提交
在实际开发中不经常使用这种方式,原因在于这种方式需要为每一个事务管理类配置一个代理类
2.2 基于AspectJ的XML方式
aspectJ的目的是为了简化AOP开发,需要引入aspectJ和spring整合aspectJ的jar包
第一步:配置事务管理器
第二步:配置事务的增强
还可以通过配置如下的一些参数来设置事务的属性
第三步:配置切面
在切点上加入事务
2.3 基于注解的方式
第一步:配置事务管理器
第二步:开启注解事务
第三步:在service上加上事务注解
注解上有一些属性,可以对事务的属性进行配置
总结