配置事务管理器,配置业务层的代理
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
测试的时候注入的是代理后的对象,就可以对方法进行事务管理了
配置
2
编程式事务控制
可以指定哪些异常发生后,事务不进行回滚
一旦设置成只读,说明此时只能读取数据库表里面的数据,而不能修改,那么insert,update,delete方法都会报错。
这个时候测试类里面要注入的类是代理类(被增强过后的),而不是之前的accountService
配置事务管理器和业务层代理对象2
key = *表示所有方法,也可以写成update*,save*都可以,还可以指定具体方法名
配置事务管理器和业务层代理对象1
声明式事务管理是通过AOP思想来完成的。引入aop相关jar包
编程式事务,对代码有侵入
222222222222222222222222222
33333333333333333
声明式事务
TransactionroxyFactoryBean 配置业务层代理
基于TransactionProxyFactoryBean实现声明式事物管理:基于AOP来实现事物管理功能(也就是在执行Dao中方法前后做一些操作)。
【1】引入AOP的jar包。
【2】配置事物管理器。
【3】实现事务管理可以为Service提供一个代理类,该代理类可以对Service方法进行增强。这里在配置文件中使用Spring传统的AOP方式配置代理类。
Spring传统的事务管理的操作中,提供了一个事物代理的工厂类TransactionProxyFactoryBean,它就可以为某一个Service产生代理对象。其中该事物代理工厂需要注入一个属性,该属性就是目标对象。接下来就会产生代理对象,产生的代理对象还需要事务管理,所以还需注入事务管理器。
要想事物管理还需要一些定义信息例如:隔离级别、传播行为。所以还需要注入一些事物属性,通过TransactionProxyFactoryBean源码可知,该事物属性该怎样配置,如图2。为何这样配置,可以找到setTransactionAttributes方法,该方法参数是Properties类型。
通过源码可知key的值为insert开头的任意方法就使用PROPAGATION_REQUIRED传播行为,其他同理。
prop的格式:
PROPAGATION:事物的传播行为。
ISOLATION:事物的隔离级别。
readOnly:只读。
-Exception:发生哪些异常回滚事物(默认情况下发生任何异常都会回滚事物)。
+Exception:发生哪些异常事物不会滚,仍然提交事物。
首先需要配置传播行为,传播行为必须要配置。这里配置PROPAGATION_REQUIRDE传播行为,它是保证业务层之间方法相互调用时在同一个事物中。
业务层无需改动,因为该方式事务管理是AOP方式实现,但是测试这里需要改动需要注入代理类,AccountServiceImpl是没有增强的类,而accountServiceProxy才是对AccountServiceImpl增强以后的类,它才具备事物处理的功能。,所以测试类需要注入accountServiceProxy,这是就可以进行实物管理了。
当事物设置成readOnly就不进行修改、删除、插入操作了。如果这情况下设置成readOnly就会发生错误。
如果使用+Exception,会发生事物仍然会提交,但不会回滚,该情况也就是钱仍然会被转丢。
此处业务层的代理 的配置 基于 TransactionProxyFactoryBean 类进行了增强操作,主要操作,通过配置目标对象,将事务管理器注入并配置响应的事务属性,在 <property><props></props></property>中配置实际需要增强的功能,即事务的传播行为;隔离级别只读,异常回滚处理等....
注意: 业务功能增强是在本配置中实现,通过配置目标对象<property name="target" ref="accountService">将业务接口引入,并在当前配置中做增强;因此真正具有增强功能的 是 "accountServiceProxy" 这个类,在引入 业务接口时需要通过 @Resource 引入 "accountServiceProxy"
本方法需要在业务接口上注入代理类,如图中, @Resource(name="accountServicceProxy")
private AccountService accountService;
声明式事务管理中,基于TransactionProxyFactoryBean的XML方式实现:
默认需要配置 org.springframeword.jdbc.datasource.DataSourceTransactionManager 外;
还要配置具体的业务层的代理,即事务代理的主要项:
org.springframeword.transaction.interceptor.TransactionProxyFactoryBean
业务类中 注入代理类
配置文件:
配置业务层的代理
声明式事务管理
基于TransactionProxyFactoryBean
配置文件1-1
配置事务管理器、配置业务层的代理
Eclipse 导入源码包
编程式的事务控制 业务类
编程式的事务控制 配置文件
transactionAttributes配置事务属性的格式
声明式事务管理方式一:基于TransactionProxyFactoryBean(AOP思想)
配置事务管理器并注入连接池
配置业务层代理TransactionProxyFactoryBean并注入目标对象、事物管理器、事物属性(方法名、事物参数,具体如图)
注:在注入service时不能注入原类,必须注入代理类事物才能生效
readOnly
配置事务相关属性: 事务传播行为, 事务隔离级别, 只读, 发生哪些异常进行回滚, 发生哪些异常不进行回滚.