Spring事务处理

事务即一系列的数据库操作,要么全部成功,要么全部失败,如果失败了,之前的操作要被回滚。
 
事务有四个特性 ACID:原子性,一致性,隔离性,持久性。
 
Spring对事务的支持
 
Spring提供编程式和声明式两种方式来管理事务。
Spring提供多种事务策略,但是,不管是声明还是编程式,这些策略都有一个统一的接口就是PlatformTransactionManager。
 
编程式的事务管理方式又分为两种:
1. 使用Spring模板,即通过TransactionTemplate的回调方法,实现TransactionCallback接口,将数据库操作放入该内部类中完成事务控制。
2.直接使用PlatformTransaction进行事务管理。需要使用TransactionDefinition和TransactionStatus进行事务的发起,回滚与提交。
 
声明式事务管理:
Spring提供3种声名式的管理方式。在早期版本的Spring中,使用TransactionProxyFactoryBean,但是从2.0以后提倡使用tx命名空间以及使用@Transactional注解来代替,但仍保留该方式。
 
首先,先了解声名式的事务有哪些特性:
Propagation定义的是事务的边界。分九种:PROPAGATION_MANDATORY,PROPAGATION_NESTED,PROPAGATION_NEVER,PROPAGATION_NOT_SUPPORTED,PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_SUPPORTS。其中,PROPAGATION_REQUIRED比较常用,意思是指定当前方法必须在一个事务里运行,如果它已属于一个事务,那么这个方法将运行在那个事务中。否则,新建一个事务运行。
 
ISOLATION LEVELS:隔离级别,他定义了一个事务怎么影响其他并发的事务。
并发事务可能会引起如下三个问题:
脏读:当一个事务读取了另一个事务中已写入但未提交的数据。如果更改的数据最后被回滚了,那么第一个数据读到的就是脏数据。
不可重复读:当一个事务执行同一个查询语句2次或者多次,并且每次得到的结果是不同的。原因很可能是其他事务更新了符合查询条件的数据。
幻读:当一个事务读取了几条数据,同时另一个事务插入了几行。而随后的查询发现多了几条之前没有的数据。
 
ISOLATION LEVELS分五个级别:ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ,ISOLATION_SERIALIZABLE
 
READ-ONLY:
标记事务为只读,其他并发的事务不能修改前者事务所要修改的数据。
 
如何在配置文件中声明呢?
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/
spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
    

 

<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS"
read-only="true"/>
</tx:attributes>
</tx:advice>
 
<aop:config>
<aop:advisor
pointcut="execution(* *..SpitterService.*(..))"
advice-ref="txAdvice"/>
</aop:config>
    

 

最后一种方法是使用注解,首先要开启事务注解的支持:<tx:annotation-driven transaction-manager="txManager" />,然后以这样的风格使用即可:
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
public class SpitterServiceImpl implements SpitterService {
...
@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
public void addSpitter(Spitter spitter) {
...
}
...
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值