编程式事务(少用):
a) 需要事务处理的dao类需继承NamedParameterJdbcDaoSupport这个类;
b) 在applicationContext.xml文件中配置这个dao的Bean以及数据源Bean;
c) 往dao中注入数据源;
d) 配置事务管理器,并往事务管理器中注入数据源;
e) 往dao中注入事务管理器。
a) 需要事务处理的dao类需继承NamedParameterJdbcDaoSupport这个类;
b) 在applicationContext.xml文件中配置这个dao的Bean以及数据源Bean;
c) 往dao中注入数据源;
d) 配置事务管理器,并往事务管理器中注入数据源;
e) 配置事务模板,并往事务模板中注入事务管理器;
f) 往dao中注入事务模板。
总结:dao(继承NamedParameterJdbcDaoSupport,并注入数据源)-->事务模板-->事务管理器(数据源)-->数据源
申明式事务:
1)使用代理工厂:
步骤
1:声明委托对象,如:
步骤
2:
定义事务管理器,如:
步骤3:创建事务代理父工厂
注意:1. abstract=“true“ 说明该工厂为抽象工厂,无法进行对象处理,只能被继承
2. transactionAttributes表示设置事务的传播属性
步骤4:创建事务子工厂
步骤
5:
调用:往需要
userDao
对象的调用者注入
userDao
注意:注入的是代理了userdao对象的事务子工厂,并且使用接口声明。
如:IUserDao userDaoProxy;
//省略get,set方法
步骤1:引入命名空间
步骤2:定义事务通知者
advice
步骤3:再通过aop织入
这就是定义了一个PointCut,该Pointcut表示“在com.softfz.jdbcTemplate包下所有的方法” 。
expression="execution(* com.cj.transaction.service.*.*(..))" 中几个通配符的含义:
第一个 * —— 通配 任意返回值类型
第二个 * —— 通配 包com.cj.transaction.service下的任意class
第三个 * —— 通配 包com.cj.transaction.service下的任意class的任意方法
第四个 .. —— 通配 方法可以有0个或多个参数
注意:第一个*后面有一个空格
申明式事务中异常处理:
Spring中,将为委托对象的每个方法创建事务,Spring的事务支持默认对运行期异常(RuntimeException)进行回滚 ,而RuntimeException无需开发者显式声明。
如果手动捕获异常,则spring容器认为开发者试图进行手动事务回滚,将无法用spring容器来进行事务回滚。
但是如果是发生非RuntimeException及其子类的异常,则spring容器无法进行事务处理 ,如果需要管理,需要进行相关配置,代码如下:
<!-- +提交,-回滚,后面为异常类型,表示该方法如果抛出这个异常则进行相应的事务处理 -->
<props>
<prop key="*">PROPAGATION_REQUIRED,-FileNotFoundException</prop>
<prop key="list">readOnly</prop>
</props>