Spring学习【四】事务管理

事务管理

编程式事务spring

  • 经过编码方式实现事务,须要在每一个执行的业务方式独立实现。实现方式可经过内部匿名类实现。

声明式事务数据库

  • 声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务有两种方式,一种是在配置文件(xml)中作相关的事务规则声明,另外一种是基于@Transactional 注解的方式

编程式事务

transactionTemplate.execute(new TransactionCallback() { 
public Object doInTransaction(TransactionStatus status) { 
try{ 
    } 
catch (Exception e) { 
} 
  finally { 

status.setRollbackOnly(); 
           ) 
);

声明式事务

xml配置编程

<!-- 事务管理配置 -->
    <bean id="springTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:annotation-driven proxy-target-class="true" transaction-manager="springTransactionManager"/>

添加【@Transaction】注解到相关方法服务器

属性名 说明
name 当在配置文件中有多个 TransactionManager , 能够用该属性指定选择哪一个事务管理器。
propagation 事务的传播行为,默认值为 REQUIRED。
isolation 事务的隔离度,默认值采用 DEFAULT。
timeout 事务的超时时间,默认值为-1。若是超过该时间限制但事务尚未完成,则自动回滚事务。
read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不须要事务的方法,好比读取数据,能够设置 read-only 为 true。
rollback-for 用于指定可以触发事务回滚的异常类型,若是有多个异常类型须要指定,各种型之间能够经过逗号分隔。
no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。

Transaction的事务传播行为

PROPAGATION_REQUIRED并发

  • 支持当前事务,若是当前没有事务,就新建一个事务。这是最多见的选择。

PROPAGATION_SUPPORTS框架

  • 支持当前事务,若是当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY性能

  • 支持当前事务,若是当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW编码

  • 新建事务,若是当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED.net

  • 以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。

PROPAGATION_NEVERcode

  • 以非事务方式执行,若是当前存在事务,则抛出异常。

isolation

DEFAULT

  • 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 .

READ_UNCOMMITTED

  • 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )

READ_COMMITTED

  • 会出现不可重复读、幻读问题(锁定正在读取的行)

REPEATABLE_READ

  • 会出幻读(锁定所读取的全部行)

SERIALIZABLE

  • 保证全部的状况不会发生(锁表)

注意

正确的设置@Transactional 的 rollbackFor 属性

  • 默认状况下,若是在事务中抛出了未检查异常(继承自 RuntimeException 的异常)或者 Error,则 Spring 将回滚事务;除此以外,Spring 不会回滚事务。除非经过【rollbackFor】指定回滚异常

@Transactional 只能应用到 public 方法才有效

避免 Spring 的 AOP 的自调用问题

  • 若同一类中的其余没有@Transactional注解的方法内部调用有@Transactional 注解的方法,有@Transactional注解的方法的事务被忽略,不会发生回滚。
  • 例:
@Service
public class OrderService {
    private void insert() {
insertOrder();
}
@Transactional
    public void insertOrder() {
        //insert log info
        //insertOrder
        //updateAccount
    }
}

JDBC和JTA事务区别

JDBC事务

  • 单库的事务,实际在与JDBC connection中实现。只局限于JDBC connection的生命周期。

JTA事务

  • 多库的事务。JTA(Java Transaction API)提供了跨数据库链接(或其余JTA资源)的事务管理能力。JTA事务管理则由JTA容器实现,J2ee框架中事务管理器与应用程序,资源管理器,以及应用服务器之间的事务通信。
相关文章
相关标签/搜索