通过前两天的学习,对spring有了个全新的认识.虽然我以前学习过也在公司里用过,可是有些东西就知道怎么使用而不明白其中的工作过程也原理.通过老
师深入的分析和讲解,使我对spring的理解有加深了一步.还有一天,好好学习.在后面的项目中使用才能得心应手.
1.事务的四个关键属性
(ACID)
原子性(atomicity)
一致性(consistency)
隔离性(isolation)
持久性 (durability)
编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚. 在编程式管理事务时, 必须在每个事务操作中包含额外的事务管理代码.
声明式事务管理: 大多数情况下比编程式事务管理更好用. 它将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理.
事务管理作为一种横切关注点, 可以通过 AOP 方法模块化. Spring 通过 Spring AOP 框架支持声明式事务管理.
事务管理是一种横切关注点
2.并发事务所导致的问题
脏读
: 对于两个事物 T1, T2, T1
读取了已经被 T2 更新但 还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.(读未提交)
不可重复读
:对于两个事物 T1, T2, T1
读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读
:对于两个事物 T1, T2, T1
从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.(读已提交)
3.基于注解的事务管理
在 XML 文件中需要配置的项目:
1)配置 JDBC 的事务管理器
<bean
id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property
name="dataSource" ref="dataSource" />
</bean>
2)配置支持基于注解方式的事务管理
<tx:annotation-driven
transaction-manager="transactionManager" />
在 Java 文件中要使用这个注解:
@Transactional
默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚. 而受检查异常不会.
rollbackFor: 遇到时必须进行回滚
noRollbackFor: 一组异常类,遇到时必须不回滚
4.基于 XML 的事务管理
XML:
配置 JDBC 的事务管理器
<bean
id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property
name="dataSource" ref="dataSource" />
</bean>
配置基于 xml 文件的事务
<tx:advice
transaction-manager="transactionManager" id="txAdvice">
配置事务属性
<tx:attributes>
<tx:method
name="purchase" propagation="REQUIRES_NEW"/>
<tx:method
name="*" />
</tx:attributes>
</tx:advice>
配置事务的使用范围: 切入点, 把切入点和事务属性关联的 advisor
<aop:config>
<aop:pointcut
expression="execution(* cn.itcast.spring.transaction.xml.*.*(..))"
id="txPointcut"/>
<aop:advisor
advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
5.事务的传播行为:
事务的多种传播行为,我们必须要掌握着两种 required, requied_new 传播行为.
required:
如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行.
requied_new
:当前的方法必须启动新事
务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起.
6.Hibernate整合
就是让 spring 管理和创建 SessionFactory.
Spring 2.0 同时支持 Hibernate 2.x 和 3.x. 但 Spring 2.5 只支持 Hibernate 3.1
或更高版本
CustomerDaoImpl 类,传统的自己手动的开启事务和关闭事务操作.
问题:
1). 因为一个 Dao 方法创建一个新的 Session, 所以无法实现事务
2). 在每个 Dao 方法中都重复写同样的事务代码
解决:
1).使用 HibernateTemplate 对象, 且使用 spring 的声明式事务.
2).使用 HibernateTemplate 对象
CustomerDaoImpl2 类,解决上面的问题.使用 HibernateTemplate 提供的类.
问题:耦合了 Spring 的 HibernateTemplate 类
解决:在 DAO 中使用 sessionFactory.getCurrentSession() 方法, 然后在 Service
层开启事务.
CustomerDaoImpl3 类, 解决 CustomerDaoImpl2 的问题.
开发中要使用这种实现
hibernate 的配置文件,可以自己配置,也可以交给 spring 配置
指定 hibernate 的配置文件:
<property
name="configLocation" value="classpath:hibernate.cfg.xml"/>
在 spring 中配置:
最好不要使用这种配置方式,配置文件不清晰,不方便管理.
<property
name="hibernateProperties">
<props>
<prop
key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop
key="hibernate.show_sql">true</prop>
<prop
key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property
name="mappingResources">
<list>
<value>cn/itcast/spring/hibernate/Customer.hbm.xml</value>
</list>
</property>
7.Struts整合
让 spring 管理 struts 的 action
①WEB.XML:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
②struts-config.xml:
一种:缺点:占用了 struts 的唯一扩展点
<action-mappings>
<action
path="/customer-add">
<forward
name="success" path="/success.jsp" />
</action>
</action-mappings>
<controller>
<set-property
property="processorClass"
value="org.springframework.web.struts.DelegatingRequestProcessor" />
</controller>
二种:
<action
path="/user-add"
type="org.springframework.web.struts.DelegatingActionProxy">
<forward
name="success" path="/success.jsp"></forward>
</action>
③将 Action 注入到 IOC 容器中.
传智播客--Spring中的事务管理,hibernate整合,struts整合(佟刚)
最新推荐文章于 2025-07-08 09:42:45 发布