spring中的事务管理(一)
spring中的事务管理(一)
作为企业级应用程序框架,Spring 在不同的事务管理 API 之上定义了一个抽象层.而应用程序开发人员不必了解底层的事务管理 API, 就可以使用Spring 的事务管理机制.
编程式事务管理
使用原生的JDBC API进行事务管理
1.获取数据库连接Connection对象
2.取消事务的自动提交
3.执行操作
4.正常完成操作时手动提交事务
5.执行失败时回滚事务
6.关闭相关资源
Spring 既支持编程式事务管理, 也支持声明式的事务管理.
编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚. 在编程式管理事务时, 必须在每个事务操作中包含额外的事务管理代码.
声明式事务管理: 大多数情况下比编程式事务管理更好用. 它将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理. 事务管理作为一种横切关注点, 可以通过 AOP 方法模块化. Spring 通过 Spring AOP 框架支持声明式事务管理.
Spring 从不同的事务管理 API 中抽象了一整套的事务机制. 开发人员不必了解底层的事务 API, 就可以利用这些事务机制. 有了这些事务机制, 事务管理代码就能独立于特定的事务技术了.
Spring 的核心事务管理抽象是interface PlatformTransactionManager它为事务管理封装了一组独立于技术的方法. 无论使用 Spring 的哪种事务管理策略(编程式或声明式), 事务管理器都是必须的.
Spring中的事务管理器的不同实现
DataSourceTransactionManager:在应用程序中只需要处理一个数据源, 而且通过 JDBC 存取
JtaTransactionManager:在 JavaEE 应用服务器上用 JTA(Java Transaction API) 进行事务管理
HibernateTransactionManager:用 Hibernate 框架存取数据库
……
事务管理器以普通的 Bean 形式声明在 Spring IOC 容器中
用 @Transactional 注解声明式地管理事务
除了在带有切入点, 通知和增强器的 Bean 配置文件中声明事务外, Spring 还允许简单地用 @Transactional 注解来标注事务方法.
为了将方法定义为支持事务处理的,可以为方法添加 @Transactional 注解. 根据 Spring AOP 基于代理机制, 只能标注公有方法.
可以在方法或者类级别上添加@Transactional 注解. 当把这个注解应用到类上时,这个类中的所有公共方法都会被定义成支持事务处理的.
在 Bean 配置文件中只需要启用 <tx:annotation-driven> 元素, 并为之指定事务管理器就可以了.
如果事务处理器的名称是transactionManager, 就可以在<tx:annotation-driven> 元素中省略 transaction-manager 属性. 这个元素会自动检测该名称的事务处理器.
<!-- 配置事务管理器 --> <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--设置数据源 --> <propertyname="dataSource"ref="dataSource"></property> </bean>
<!--启用事务的注解支持 --> <!--如果事务管理器的id属性值是transactionManager,transaction-manager属性就可以省略 --> <tx:annotation-driven/>
|
用事务通知声明式地管理事务(xml)
<!-- 配置事务管理器 --> <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propertyname="dataSource"ref="dataSource"></property> </bean>
<!--配置事务 --> <tx:adviceid="txAdvice"> <!--配置添加事务的方法 --> <tx:attributes> <!--给具体的方法添加事务 --> <tx:methodname="test"propagation="REQUIRED"/> <!--给查询的方法添加事务 --> <tx:methodname="get*"read-only="true"/> <!--给所有的方法添加事务 --> <tx:methodname="*"/> </tx:attributes> </tx:advice> <!--配置中AOP --> <aop:config> <!--配置切入点表达式 --> <aop:pointcutexpression="execution(* com.atguigu.service.*.*(..))" id="pointCut"/> <!--将添加的方法与切入点表达式关联 起来 --> <aop:advisoradvice-ref="txAdvice"pointcut-ref="pointCut"/> </aop:config> |