Spring提供了灵活方便的事务管理功能,这些功能都是基于底层数据库本身的事务处理机制工作的.

Spring为事务管理提供了一致的编程模板,在高层次建立了统一的事务抽象,也就说不管hibernate,mybatis,JPA,spring都可以让用户用统一的编程模型进行事务管理.

Spring将事务管理委托给底层具体的持久化实现框架来完成,因此,Spring为不同的持久化框架提供了PlatformTransactionManager 接口的实现类,

这些事务管理器都是对特定事务实现框架的代理,这样就可以通过Spring所提交的高级抽象对不同种类的事务实现使用相同的方式进行管理,而不关心具体的实现.

要实现事务管理,首先要在Spring中配置好相应的事务管理器,为事务管理器指定数据资源及一些其他事务管理控制属性.下图是mybatis的配置

使用注解配置声明式事务

Spring的声明式事务是通过SpringAOP实现的,通过事务的声明性信息,Spring负责将事务管理增强逻辑动态织入业务方法的相应连接点中,这些逻辑包括获取线程绑定资源,开始事务,提交/回滚事务,进行异常转换和处理工作.

Spring提供了基于注解的事务配置,即通过@Transactional对需要事务增强的Bean接口,实现类,或方法进行标注,在容器中配置基于注解的事务增强驱动,即可启用基于注解的声明式事务,

使用@Transactional注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
@Transactional
public class ForumService
{
public void addtopic(Topic topic) throws Exception
{
topicDao.addTopic(topic);
postDao.addPost(topic.getPost());
}
public Forum getForum(int id)
{
return forumDao.getForum(id);
}
}

因为注解本身具有一组普适性的默认事务属性,所以往往只需要在需要事务管理的业务类中添加一个@transactional注解,就完成了业务类事务属性的配置.

然后还需要在spring配置文件中通过一行小小的配置”通知”Spring容器对标注@Transactional注解的bean加工处理

1
<tx: annotation-driven transaction-manager ="数据源事务管理器的id">

两种事务管理方式

Spring 支持编程式事务管理和声明式事务管理两种方式

编程式事务管理使用TransactionTemplate(推荐使用)或者直接使用底层的PlatformTransactionManager。

声明式事务管理是建立在AOP基础上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明,便可以将事务规则应用到业务逻辑中。

声明式事务也有两种常用的方法,一种是基于tx和aop命名空间的xml配置文件,另一种就是基于@Transactional注解。