spring事务管理器:
一、基本原理:拦截指定方法,在方法执行之前,会先获取一个session,并绑定到当前线程中,并通过该session打开一个事务。在方法执行之后,先获取到当前线程中的session,并通过session获取已经打开的事务,然后提交/回滚事务,最后关闭session。
二、事务管理器类型:
1、Hibernate事务管理器:HibernateTransactionManager
2、JDBC事务管理器:DataSourceTransactionManager
三、spring配置hibernate声明式事务:
1、配置Hibernate事务管理器。
2、配置spring特有的事务管理的通知,在通知中指定事务传播机制。
3、使用spring aop在指定的切点上应用事务。
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 寻找advice 重复代码 横切性关注点-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
注意:
-
name 是必须的,表示与事务属性关联的方法名(业务方法名),对切入点进行细化。通配符(*)可以用来指定一批关联到相同的事务属性的方法
-
propagation 不是必须的 ,默认值是REQUIRED
表示事务传播行为, 包括REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTEDREQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。
NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。 REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。 MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。 SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。 NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。 NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
-
read-only 不是必须的 默认值false不是只读的
表示事务是否只读? 在将事务设置成只读后,相当于将数据库设置成只读数据库,此时若要进行写的操作,会出现错误<!-- 寻找pointcut--> <aop:pointcut id="pointCut" expression="execution(* 包.*.*(..))"/> <!-- 植入 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
</aop:config>
【总结】:
1、使用spring的事务管理后,我们自己不能在程序中控制事务了,session也不能控制开/关了
2、Spring事务是由Spring AOP完成的,Spring AOP是由动态代理实现的,因此spring事务从根本上说也是由动态代理实现的。应用了spring事务的类,spring会为该类一个代理。
指定配置文件路径:
contextConfigLocation
classpath:applicationContext*.xml
ssh框架集成web中配置:
org.springframework.web.context.ContextLoaderListener
集成的时候,要删除struts2核心包下的antlr低版本包,因为与hibernate核心包下的antlr高版本起冲突
spring配置文件中import标签导入外部spring配置文件:
来源:CSDN
作者:qq_45990281
链接:https://blog.csdn.net/qq_45990281/article/details/104613359