spring事务管理的几个问题

来源:互联网 发布:sql复合主键3个 编辑:程序博客网 时间:2024/06/06 10:08

 

首先说明,不是spring的问题,是程序员编程时要注意的问题,不要被标题误导了哈。

原文地址:不得不说spring事务管理的几个问题,欢迎查看。
spring通过aop机制为项目的事务管理带来了极大的方便,有了事务切面,我们的代码中再也看到commit、rollback之类的语句,我们要做的仅仅是在需要事务的地方声明事务的一些属性,spring给我们的项目带来了实实在在的好处。

一、事务声明位置
我们先来看事务声明的位置,事务声明的位置无外乎在表现层,业务层,持久层这三个地方。
如果将事务声明在持久层,粒度会显得过细,因为持久层一般都是些普通的CRUD操作,大多方法中仅仅一条sql语句而已;事务可以放在业务层,一个业务方法一般情况下会作为一个完整的事务,所以,事务控制在业务层是一种通用的做法;也可以将事务放在表现层的请求执行的方法上,当然这种情况并不多见。

二、事务属性
spring事务属性配置项包括:事务传播属性,事务隔离级别,只读提示以及事务超时时间属性,这四种属性中,我们关注最多的是事务隔离级别和只读提示,其它两种直接使用系统默认值即可。这些所有的可配置项,可以在spring的org.springframework.transaction. TransactionDefinition源码中看到,源码节选如下,英文好的可以研究一下里面的说明:

View Code JAVA

事务传播属性,一般选用PROPAGATION_REQUIRED,表示此方法的运行需要运行在一个事务环境中,如果没有就创建一个新的,这种方式适合大多数业务情况。如果你不向让被调用的方法事务失败影响到本方法的事务,可选用PROPAGATION_REQUIRES_NEW。

我要强调的是,事务传播属性用于不同的类之间的业务方法调用中的事务的控制,一定要注意是不同类中不同业务方法,同一个类中不同方法可能不起作用,这是由spring aop方法切入实现有关(同一个类中不同方法之间的调用将不被拦截)。

事务只读提示readOnly属性,标明了该事务不可修改数据,一般查询方法都标成readOnly,可以提高系统性能。

事务隔级别是本方法执行过程中,数据库在事务方面应采用的级别,一般采用默认值ISOLATION_READ_COMMITTED即可满足要求,因此,该属性我们一般不设置。
事务超时属性一般不设置,用默认值(不限制)即可。

三、事务的提交与回滚
spring通过业务方法执行过程是否抛出了异常来判断是回滚还是提交事务,看似简单的一句话,却被很多人忽视了一个非常重要的一点。那就是spring只检测RuntimeException及其子类,对检测到的Exception将不回滚,因些,在事务属性配置中有一个rollbackFor属性,用来指定哪种异常回滚。对这点理解不清会得到惨重的教训的,呵呵。

四、编程式事务、配置式事务,xml or annotation?
编程式事务可以在小型项目中使用,可以使用TransactionTemplate的doInTransaction回调实现,要回滚事务需要设置transactionStatus.的setRollbackOnly来设置事务状态;也可以得到一个PlatformTransactionManager实例才操作,具体请参阅Spring参考手册9.6.2节内容。
配置式事务是强烈推荐的一种方式,但是配置式事务的属性可以写到xml文件中,这种方式对业务方法(假设事务控制在业务层)的命名有所限制,也就是要求业务方法命名要有规律可循。如果你采用annotation来配置,则没了这个约束,这也更加有利于业务方法的设计(业务方法命名一般更具有业务含义,天马行空也许更适合些)。

总之,事务管理是做软件系统的程序要不可回避的问题,用spring帮助我们来管理事务是明智之举,上面的这些问题希望对你处理好项目中的事务有所帮助。

0 0
原创粉丝点击