이 글에서는 트랜잭션 관리 구성을 위한 Spring의 주석 사용을 주로 소개합니다. 편집자는 이것이 꽤 좋다고 생각하므로 이제 공유하고 참고용으로 제공하겠습니다. 편집기를 따라 살펴보겠습니다.
사용 단계:
1단계. 스프링 구성에
<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">
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): 하나의 트랜잭션이 다른 트랜잭션에 읽혀지는 트랜잭션의 커밋되지 않은 업데이트된 데이터
비반복 읽기: 동일한 트랜잭션에서 동일한 데이터를 여러 번 읽어 반환되는 결과가 다릅니다. 즉,
후속 읽기에서는 다른 트랜잭션에서 제출한 업데이트된 데이터를 읽을 수 있습니다. 반대로 "반복 읽기"는 데이터를 여러 번 읽을 때 읽은 데이터가 동일함을 보장할 수 있습니다. 즉, 동일한 트랜잭션에서 후속 읽기는 다른 트랜잭션이 제출한 업데이트된 데이터를 읽을 수 없습니다.
팬텀 읽기: 한 트랜잭션이 다른 트랜잭션이 제출한 삽입 데이터를 읽습니다.
매개변수 이름 | 함수 설명
| ||||||
<🎜>readOnly<🎜> | <🎜>이 속성은 읽기 전용 여부를 설정하는 데 사용됩니다. 현재 트랜잭션 읽기 전용 트랜잭션으로, 읽기 전용을 나타내려면 true로 설정하고 읽기-쓰기를 나타내려면 false로 설정하며 기본값은 false입니다. 예: @Transactional(readOnly=true)<🎜> | ||||||
<🎜>rollbackFor<🎜> | <🎜>이 속성은 다음을 설정하는 데 사용됩니다. 롤백을 위한 필수 예외 클래스 배열입니다. 지정된 예외 배열의 예외가 메서드에서 발생하면 트랜잭션이 롤백됩니다. 예: <🎜><🎜>단일 예외 클래스 지정: @Transactional(rollbackFor=RuntimeException.class)<🎜><🎜>여러 예외 클래스 지정: @Transactional(rollbackFor={RuntimeException.class, Exception.class}) < 🎜> |
계속 표)
| <🎜>함수 설명<🎜> | ||||||||||||||
<🎜>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" , "예외"})<🎜> | |||||||||||||||
<🎜>전파< /span><🎜> | <🎜>이 속성은 트랜잭션 전파 동작을 설정하는 데 사용됩니다. 구체적으로 해당 값은 표 6-7에서 확인할 수 있습니다. <🎜><🎜>예: @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)<🎜> | < / tr>||||||||||||||
<🎜>격리<🎜> | <🎜>이 속성은 기본 데이터베이스의 트랜잭션 격리 수준을 설정하는 데 사용됩니다. 트랜잭션 격리 수준은 다중 트랜잭션 동시성을 처리하는 데 사용됩니다. 일반적으로 데이터베이스의 기본 격리가 사용되며, 기본적으로 설정할 필요가 없습니다.<🎜> | ||||||||||||||
<🎜> 시간 초과<🎜> | <🎜>이 속성은 트랜잭션 시간 초과(초)를 설정하는 데 사용됩니다. 기본값은 -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所使用。上面的例子中,其实正是
5、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。
위 내용은 트랜잭션 관리 구성을 위한 Spring의 주석 사용 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!