>  기사  >  Java  >  트랜잭션 관리 구성을 위한 Spring의 주석 사용 예에 ​​대한 자세한 설명

트랜잭션 관리 구성을 위한 Spring의 주석 사용 예에 ​​대한 자세한 설명

Y2J
Y2J원래의
2017-05-02 11:47:471519검색

이 글에서는 트랜잭션 관리 구성을 위한 Spring의 주석 사용을 주로 소개합니다. 편집자는 이것이 꽤 좋다고 생각하므로 이제 공유하고 참고용으로 제공하겠습니다. 편집기를 따라 살펴보겠습니다.

사용 단계:

1단계. 스프링 구성에 cc2c39e2370aac9d3896793edbbe786f 네임스페이스

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
를 도입합니다. file

2단계. @Transactional 주석이 있는 Bean은 선언적 트랜잭션을 지원하도록 자동으로 구성됩니다.

<!-- 事务管理器配置, Hibernate单数据源事务 -->
  <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
  
  <!-- 使用annotation定义事务 -->
  <tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />

3단계. 인터페이스 또는 클래스 선언에서 write @Transactional.

이 인터페이스에만 작성되면 인터페이스 구현 클래스가 상속됩니다. 인터페이스 구현 클래스의 특정 메서드는 클래스 선언의 설정을 재정의할 수 있습니다.

@Transactional //클래스 수준 주석, 클래스의 모든 공용 메서드에 적용 가능

트랜잭션 전파 동작 및 격리 수준

모두가 Spring을 사용하고 있습니다. 주석 기반 트랜잭션 관리를 사용할 때 트랜잭션 전파 동작 및 격리 수준에 약간 압도될 수 있습니다. 다음은 쉽게 참조할 수 있도록 자세히 소개합니다.

Thing 주석 메서드: @Transactional

클래스 앞에 표시되면 표시된 클래스의 모든 메서드가 트랜잭션 처리를 수행합니다. 예:

@Transactional
public class TestServiceBean implements TestService {}

클래스의 일부 메서드에 항목이 필요하지 않은 경우:

@Transactional
public class TestServiceBean implements TestService {  
  private TestDao dao;  
  public void setDao(TestDao dao) {
    this.dao = dao;
  }  
  @Transactional(propagation = Propagation.NOT_SUPPORTED)
  public List<Object> getAll() {
    return null;
  }  
}

사물 전파 동작 소개:

@Transactional(propagation=Propagation.REQUIRED)

트랜잭션이 있으면 트랜잭션에 참여하고, 없으면 새 트랜잭션을 만듭니다(기본값)

@Transactional(propagation=Propagation.NOT_SUPPORTED)

컨테이너는 이 방법으로 트랜잭션을 열지 않습니다.

@Transactional(propagation=Propagation.REQUIRES_NEW)

트랜잭션 존재 여부에 관계없이, 새 트랜잭션이 생성되고 원래 트랜잭션이 일시 중지됩니다. 새 실행이 완료된 후 이전 트랜잭션을 계속 실행합니다

@Transactional(propagation=Propagation.MANDATORY)

은 기존 트랜잭션에서 실행되어야 합니다. 그렇지 않으면 예외가 발생합니다.

@Transactional(propagation=Propagation.NEVER)

은 기존 트랜잭션에서 실행되어야 합니다. 그렇지 않으면 예외가 발생합니다(Propagation.MANDATORY의 반대)

@Transactional(propagation=Propagation.SUPPORTS)

다른 Bean이 이 메소드를 호출하고 선언하면 다른 Bean의 트랜잭션을 사용하고 다른 Bean이 선언되지 않은 경우 트랜잭션을 사용할 필요가 없습니다.

Thing timeout 설정:

@Transactional(timeout=30) //기본값은 30초

트랜잭션 격리 수준:

@Transactional(isolation = Isolation.READ_UNCOMMITTED)

커밋되지 않은 데이터 읽기(더티 읽기 및 반복 불가능한 읽기가 발생함) 기본적으로 사용되지 않음

@Transactional(isolation = Isolation.READ_COMMITTED)

제출된 데이터 읽기( 반복 불가능 읽기 및 팬텀 읽기 발생)

@Transactional(isolation = Isolation.REPEATABLE_READ)

반복 읽기(팬텀 읽기 발생)

@Transactional(isolation = Isolation.SERIALIZABLE)

직렬화

MYSQL: 기본값은 REPEATABLE_READ 수준

SQLSERVER: 기본값은 READ_COMMITTED

더티 읽기(Dirty read): 하나의 트랜잭션이 다른 트랜잭션에 읽혀지는 트랜잭션의 커밋되지 않은 업데이트된 데이터

비반복 읽기: 동일한 트랜잭션에서 동일한 데이터를 여러 번 읽어 반환되는 결과가 다릅니다. 즉,

후속 읽기에서는 다른 트랜잭션에서 제출한 업데이트된 데이터를 읽을 수 있습니다. 반대로 "반복 읽기"는 데이터를 여러 번 읽을 때 읽은 데이터가 동일함을 보장할 수 있습니다. 즉, 동일한 트랜잭션에서 후속 읽기는 다른 트랜잭션이 제출한 업데이트된 데이터를 읽을 수 없습니다.

팬텀 읽기: 한 트랜잭션이 다른 트랜잭션이 제출한 삽입 데이터를 읽습니다.

@Transactional에서 일반적으로 사용됩니다. 주석 매개변수 설명

매개변수 이름

함수 설명

参 数 名 称

功 能 描 述

readOnly

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)

rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

readOnly 이 속성은 읽기 전용 여부를 설정하는 데 사용됩니다. 현재 트랜잭션 읽기 전용 트랜잭션으로, 읽기 전용을 나타내려면 true로 설정하고 읽기-쓰기를 나타내려면 false로 설정하며 기본값은 false입니다. 예: @Transactional(readOnly=true)
rollbackFor 이 속성은 다음을 설정하는 데 사용됩니다. 롤백을 위한 필수 예외 클래스 배열입니다. 지정된 예외 배열의 예외가 메서드에서 발생하면 트랜잭션이 롤백됩니다. 예: 단일 예외 클래스 지정: @Transactional(rollbackFor=RuntimeException.class)여러 예외 클래스 지정: @Transactional(rollbackFor={RuntimeException.class, Exception.class})

계속 표)

noRollbackForClassName

参 数 名 称

功 能 描 述

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")

指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:

指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:

指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")

指定多个异常类名称:

@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation

该属性用于设置事务的传播行为,具体取值可参考表6-7。

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

timeout

该属性用于设置事务的超时秒数,默认值为-1表示永不超时

매개변수 이름
함수 설명
rollbackForClassName 이 속성은 필요한 예외 클래스 이름의 배열을 설정하는 데 사용됩니다. 롤백하려면 지정된 예외 이름 배열의 예외가 메서드에서 발생하면 트랜잭션이 롤백됩니다. 예: 단일 예외 클래스 이름 지정: @Transactional(rollbackForClassName="RuntimeException")여러 예외 클래스 이름 지정: @Transactional(rollbackForClassName={"RuntimeException","Exception"})
noRollbackFor 이 속성은 롤백이 필요하지 않은 예외 클래스의 배열을 설정하는 데 사용됩니다. 지정된 예외 배열의 예외가 메서드에서 발생하면 트랜잭션이 롤백되지 않습니다. 예: 단일 예외 클래스 지정: @Transactional(noRollbackFor=RuntimeException.class) 여러 예외 클래스 지정: @Transactional(noRollbackFor={RuntimeException.class, Exception.class})
이 속성은 롤백이 필요하지 않은 예외 클래스 이름의 배열을 설정하는 데 사용됩니다. 지정된 예외 이름 배열의 예외가 메서드에서 발생하면 트랜잭션이 발생합니다. 롤백되지 않습니다. 예: 단일 예외 클래스 이름 지정: @Transactional(noRollbackForClassName="RuntimeException")여러 예외 클래스 이름 지정:@Transactional(noRollbackForClassName={"RuntimeException" , "예외"})
전파 이 속성은 트랜잭션 전파 동작을 설정하는 데 사용됩니다. 구체적으로 해당 값은 표 6-7에서 확인할 수 있습니다. 예: @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
격리 이 속성은 기본 데이터베이스의 트랜잭션 격리 수준을 설정하는 데 사용됩니다. 트랜잭션 격리 수준은 다중 트랜잭션 동시성을 처리하는 데 사용됩니다. 일반적으로 데이터베이스의 기본 격리가 사용되며, 기본적으로 설정할 필요가 없습니다.
시간 초과 이 속성은 트랜잭션 시간 초과(초)를 설정하는 데 사용됩니다. 기본값은 -1이며 이는 시간 초과가 발생하지 않음을 의미합니다.

 注意的几点:

1 @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

2用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

如下:

 @Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
public void methodName() {
 throw new Exception("注释");

 }
 @Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
public ItimDaoImpl getItemDaoImpl() {
 throw new RuntimeException("注释");
 }

3、@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

4、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 9e4580300b4ee94180ae502c8f21c1b3元素的出现 开启 了事务行为。

5、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

위 내용은 트랜잭션 관리 구성을 위한 Spring의 주석 사용 예에 ​​대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.