이 기사는 주로 다음과 같이 Spring의 거래 메커니즘의 관련 내용을 연구합니다.
일반적으로 두 가지 거래 전략이 있습니다 : 글로벌 거래 및 지역 거래. 글로벌 트랜잭션은 여러 트랜잭션 리소스 (즉, 데이터 소스, 일반적으로 데이터베이스 및 메시지 대기열)에 걸쳐있을 수 있으며 일반적으로 서버의 JTA 지원이 바닥에 필요한 J2EE 애플리케이션 서버의 관리가 필요합니다. 지역 거래는 기본 계층에 의해 채택 된 지속성 기술과 관련이 있습니다. 기본 레이어가 JDBC를 직접 사용하는 경우 연결 객체를 사용하여 트랜잭션을 작동해야합니다. 최대 절전 모드 관리 기술을 사용하는 경우 세션 객체를 사용하여 트랜잭션을 작동해야합니다.
일반적으로 JTA 트랜잭션, JDBC 거래 및 최대 절전 모드 트랜잭션을 사용한 프로그래밍 프로세스는 대략 다음과 같습니다.
위 그림에서 볼 수 있듯이 기존 트랜잭션 프로그래밍을 사용하여 프로그램 코드는 특정 트랜잭션 정책의 API와 결합되어야합니다. 응용 프로그램이 전략을 전환 해야하는 경우 코드를 크게 수정해야 함을 의미합니다. 그러나 스프링 트랜잭션을 사용하는 경우 아무런 문제가 없습니다.
Sring은 트랜잭션 지원을 제공하지 않으며 기본 거래를 마무리 할 책임이 있으며 스프링 레벨에서는 통합 프로그래밍 API를 외부 세계에 제공합니다. 스프링 트랜잭션의 핵심은 PlatformTransactionManager 인터페이스입니다.
PlatformTransactionManager는 특정 유형과 무관 한 트랜잭션 인터페이스를 나타내며 JDBC 트랜잭션, 최대 절전 모드 트랜잭션 및 JTA 트랜잭션을 포함한 모든 트랜잭션을 나타낼 수 있습니다.
Springa 트랜잭션 메커니즘은 일반적인 정책 모델입니다. PlatformTransactionManager는 트랜잭션 관리 인터페이스를 나타내지 만 트랜잭션을 관리하는 방법을 모릅니다. 트랜잭션 시작 getTransaction(), commit() , 거래 및 rollback() 세 가지 방법을 제공하기 만하면 트랜잭션 관리 만 필요합니다. 그러나 특정 구현은 구현 클래스에 맡겨져 완료합니다. 프로그래머는 사용 된 특정 트랜잭션 유형에 따라 구성 파일에서 트랜잭션 유형을 구성하면됩니다. 기본 스프링은 특정 트랜잭션 구현 클래스를 자동으로 사용하여 트랜잭션 운영을 수행합니다. 프로그래머의 경우 기본 프로세스에 대해 전혀 신경 쓰지 않아도되며 PlatformTransactionManager 인터페이스 만 프로그램하면됩니다. PlatformTransactionManager 인터페이스는 다음 방법을 제공합니다. getTransaction(..), commit(); rollback(); 이들은 모두 플랫폼과 관련이없는 트랜잭션 운영입니다.
getTransaction() 의 전체 쓰기는 TransactionStatus getTransaction(TransactionDefinition definiton) 입니다.
이 메소드는 트랜잭션 객체를 반환하는 데 사용되며 매개 변수 트랜잭션 확인은 트랜잭션 객체에 대한 다양한 속성을 지정할 수 있습니다. 일반적으로 트랜잭션의 분리 속성, 전파 속성, 시간 초과를 지정하고 이러한 속성 만 읽을 수 있습니다.
Spring의 특정 트랜잭션 관리를 위해서는 PlatformTransactionManager가 구성 파일에서 구성되어야합니다. 다음은 다른 유형의 트랜잭션에 해당하는 스프링 구성입니다.
JDBC 데이터 소스의 로컬 트랜잭션 관리자의 구성은 다음과 같습니다.
<!-데이터 소스 Bean을 정의하고 C3P0 데이터 소스를 사용하여 구현하고 데이터 소스의 필요한 정보를 주입합니다-> <bean id = "dataSource"Destroy-method = "close"p : driverclass = "com.mysql.jdbc.driver"p : jdbcurl = "jdbc : myssql : // localhost/test"p : user = "p :" "p :" p : maxpoolsize = "40"p : minpoolsize = "2"p : initialpoolsize = "2"p : maxIdletime = "30" /> <!-JDBC 데이터 소스의 로컬 데이터 관리자를 구성하고 DataSourCetransactionManager class-> <Bean ical idactanager "p : dataSource-ref =" />>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
컨테이너 관리를위한 JTA 글로벌 트랜잭션 관리자의 구성은 다음과 같습니다.
<bean id = "dataSource"p : jndiname = "jdbc /jpetstore" /> <!-jtatransactionManager 클래스를 사용 하여이 클래스는 플랫폼 transactionManager 인터페이스-> <!-JTA 글로벌 트랜잭션을 사용하여 종속성 주입없이 Java EE 서버에서 트랜잭션 리소스를 얻을 수 있습니다.
JTA 글로벌 트랜잭션의 경우 트랜잭션 관리자의 구현 클래스 jtatransactionManager 만 지정하면됩니다. 스프링 컨테이너는 트랜잭션 관리자에 대한 명시적인 주입없이 J2EE 서버 자체로 데이터 소스를 얻습니다.
최대 절전 모드 지속성 기술을 기반으로하는 스프링 로컬 트랜잭션 구성은 다음과 같습니다.
<!-데이터 소스 Bean을 정의하고 C3P0 데이터 소스를 사용하여 구현하고 데이터 소스의 필요한 정보를 주입합니다-> <bean id = "dataSource"Destroy-method = "close"p : driverclass = "com.mysql.jdbc.driver"p : jdbcurl = "jdbc : myssql : // localhost/test"p : user = "p :" "p :" p : maxpoolsize = "40"p : minpoolsize = "2"p : initialpoolsize = "2"p : maxIdletime = "30" /> <!-데이터 소스에 의존 해야하는 SessionFactory 요구 사항을 정의합니다. DataSource-> <bean id = "sessionfactory"p : dataSource = "<!-ansotates is". 모든 영구 클래스-> <속성 이름 = "annotatedClasses"> <list> <!-다음은 모든 PO 클래스-> <alue> com.entity.user </value> </list> </property> <!-hibernate의 세션 팩토리 속성을 정의하는 데 사용됩니다. <property name = "HibernateProperties"> <! <! key = "hibernate.dialect"> org.hibernate.dialect.mysql5innodbdialect </prop> <!-hibernate 매핑 테이블을 기반으로 데이터 테이블을 만들 것인지-> <prop key = "hibernate.hbm2ddl.auto"> 업데이트 </prop> </bean> <! HiberNateTransactionManager 클래스-> <!-이 클래스는 Hibernate에 대한 PlatformTransactionManager 인터페이스의 특정 구현입니다 .-> <!-HiberNateTransactionManager 구성 SESSIONFACTORY-> <BEAN ID = "TransactionManager"P : SessionActory-Ref = "SessionCactory" />
Spring Transactions가 최대 절전 모드 정책을 채택하는 경우 일반적으로 데이터 소스, SessionFactory 및 Transaction Manager의 구성을 구성하는 데 3 개의 점이 필요합니다.
기본 계층이 최대 절전 모드 지속성 계층 기술을 사용하고 트랜잭션이 JTA 글로벌 트랜잭션을 사용하는 경우 구성은 다음과 같습니다.
<!-JTA 데이터 소스를 구성-> <bean id = "dataSource"p : jndiname = "jdbc /jpetstore" /> <!-Hibernate SessionFactory 정의. SessionFactory는 데이터 소스에 의존하고 데이터 소스를 주입해야합니다-> <bean id = "sessionFactory"P : DataSource-Ref = "DataSource"> <!-주석은 모든 영구 클래스를 나열하는 데 사용됩니다.> <속성 이름 = "AnnotatedClasses"> <list> <!-다음은 모든 PO 클래스를 사용하는 데 사용됩니다. <!-Hibernate의 세션 별 속성 정의-> <속성 이름 = "HibernateProperties"> <props> <!-Hibernate의 연결 방언을 지정합니다-> <prop key = "hibernate.dialect"> org.hibernate.dialect.dialect.mysql5innodbdialect </prop>-Hibernate Matpabes를 기반으로하는지 여부-<! key = "Hibernate.hbm2ddl.auto"> 업데이트 </prop> </props> </property> </bean> <!-JTATRANSACTIONMANAGER 클래스를 사용합니다.
이전 최대 절전 모드 기반 스프링 트랜잭션과 비교하여 데이터 소스를 JNDI 데이터 소스로 바꾸고 트랜잭션 관리자를 JTAtransactionManager로 바꾸는 것입니다.
JTA 글로벌 트랜잭션의 경우 기본 애플리케이션 서버의 지원이 필요하기 때문에 다른 응용 프로그램 서버가 제공하는 JTA 글로벌 트랜잭션간에 세부 사항이있을 수 있습니다. 따라서 실제로 글로벌 트랜잭션 관리자를 구성 할 때는 Oracle의 Javaee Application Server가 제공 한 OC4JJTATRANSACTIONMANAGER와 같은 JTATRANSACTIONMANAGER의 서브 클래스를 사용해야 할 수도 있습니다.
위의 다양한 트랜잭션 유형의 스프링 구성에서 응용 프로그램이 스프링 트랜잭션 관리를 채택 할 때 응용 프로그램을 특정 트랜잭션 API와 결합 할 필요가 없음을 알 수 있습니다. 응용 프로그램은 PlatormtransactionManager 인터페이스에만 프로그래밍되면됩니다. ApplicationContext는 구성 파일을 기반으로 적절한 트랜잭션 정책 구현 클래스 (즉, PlatormtransactionManager의 구현 클래스)를 선택합니다.
따라서 봄에 트랜잭션 제어 프로그래밍을 수행하는 방법을 자세히 설명하면 일반적으로 두 가지 방법이 있습니다.
프로그래밍 트랜잭션 관리 : PlatormtransactionManager가 제공 한 세 가지 추상 방법을 직접 사용하여 코드의 트랜잭션 흐름을 제어하는 것입니다. 스프링 컨테이너에 유형의 PlatormtransactionManager의 Bean을 얻을 수도 있습니다. 이 Bean은 항상 PlatormtransactionManager의 특정 구현 클래스의 인스턴스입니다. 특정 구현 클래스는 정책 패턴에 따라 ApplicationContext에 의해 선택됩니다. 프로그래머는 이에 대해 신경 쓰지 않아도되며 인터페이스 지향 만 프로그래밍하면됩니다.
선언 트랜잭션 관리 :이 방법은 트랜잭션 제어 프로세스가 코드에 기록되어 있지 않지만 AOP를 사용하여 구성 파일을 통해 트랜잭션 통합을 완전히 완료합니다. 즉, XML 구성 파일은 비즈니스 구성 요소의 트랜잭션 에이전트를 구성 할 수 있으며 트랜잭션 에이전트는 비즈니스 구성 요소에 대한 트랜잭션 제어를 제공합니다. 이제이 방법은 가장 낮은 소스 코드 침입으로 최고입니다.
선언 트랜잭션을 사용하는 경우 구성 파일 만 작성하고 트랜잭션 제어가 필요한 구성 요소 유형 만 구성하면됩니다. 비즈니스 구성 요소는 AOP 메커니즘에 따라 트랜잭션 컨트롤로 직조되며 프로그래머는 트랜잭션 관리 코드를 작성할 필요가 없으며 비즈니스 구성 요소 개발에 중점을 둘 수 있습니다. 따라서 선언적 거래 관리가 일반적으로 권장됩니다.
Spring의 XML 스키마 방법은 간결한 트랜잭션 구성 전략을 제공합니다. 트랜잭션의 다양한 속성을 지정할 수있는 네임 스페이스 <tx:advice> 을 통해 트랜잭션 향상 처리를 구성합니다 (예 : 격리 속성, 전파 속성, 읽기 전용 속성 등) 및 트랜잭션 향상은 AOP의 진입 점 (즉, eeng의 eenecution tothet)에 바인딩 될 수 있습니다. 거래 운영. 다음은 C3P0 데이터 소스, Spring의 JDBC Transaction Manager를 사용하여 데이터 운영에 대한 NewsDaoimpl Bean을 구성하고 <TX : Advice의 트랜잭션에 대한 속성을 설정하는 간단한 예입니다.
완전한 스프링 구성은 다음과 같습니다.
<? xml version = "1.0"alcoding = "utf-8"?> <beans xmlns : xsi = "http://www.w.w.2001/xmlschema-instance"xmlns = "http://ww.springframework.org/schema/beans" xmlns : p = "http://www.springframework.org/schema/p"xmlns : aop = "http://www.springframework.org/schema/aop"xmlns : tx = "http://www.springfrfamwork.org/schema/tx" xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aoop http://www.springframework.org/schema/aop http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.spramework.org/schema/tx/spring-4. C3P0 데이터 소스를 구현하고 데이터 소스의 필요한 정보를 주입합니다 .-> <bean id = "dataSource"Destion-method = "close"p : driverclass = "com.mysql.jdbc.driver"p : jdbcurl = "jdbc : mysql : // localhost/test? true & 특성 Encoding = utf-8"p : "p : 8"p : p : password = ""p : maxpoolsize = "40"p : minpoolsize = "2"p : initialpoolsize = "2"p : maxIdletime = "30" /> <!-JDBC 데이터 소스의 로컬 데이터 관리자를 구성하고 DataSourcetransactionManager class-> <bean id = "pransactionManager"p : dataSource " /<"! Business Logic Bean-> <bean id = "newsdao"p : ds-ref = "dataSource" /> <!-트랜잭션 향상 처리를 구성하고 트랜잭션 관리자를 지정-> <tx : "txadvice"transaction-manager = "transactionManager"> <!-세부 거래 정의를 구성하는 데 사용됩니다-<tx : Allibute : All Ablity with with with with with with with with with weating weating <! <TX : 메소드 이름 = "get*"read-donly = "true" /> <!-다른 모든 방법은 기본적으로 트랜잭션이 적용되며, 5 초의 타임 아웃을 지정합니다-> <tx : 메소드 이름 = "*"islogation = "default"propagation = "필수"시간 초과 = "5" /> < /tx : elptributes : <aop : config> <! 임플란치 패키지 아래의 모든 명소 엔드 클래스의 메소드-> <aop : pointcut expression = "execution (*com.dao.impl.*impl.*(..))"id = "myPointCut" /> <!-진입 점을 바인딩하고 txadvice를 향상시키고 txadvice를 향상시킵니다. INMP 패키지에서 ABC로 시작하는 클래스의 모든 메소드 실행에 맞는 진입 점 -> </aop : config> </beans>
NewsDaoimpl 코드에서는 중복 데이터를 테이블에 삽입하는 것입니다.
패키지 com.dao.impl; import javax.sql.datasource; import org.springframework.jdbc.core.jdbctemplate; import com.dao.newsdao; public class newsdaoimpl은 Newsdao {private dataSource ds (public void setds) {this. void insert (문자열 제목, 문자열 내용) {// C3P0 데이터 풀의 사용법 JDBCTEMPLATE JT = NEW JDBCTEMPLATE (DS); JT.UPDATE ( "News_Inf" + "값 (100,?,?)", 제목, 내용); "News_Inf" + " +",? 트랜잭션 제어가없고 첫 번째 레코드를 삽입 할 수 있습니다 // 트랜잭션 제어가 추가되면 첫 번째 레코드가 삽입되지 않습니다}}테스트 방법은 다음과 같습니다.
public static void test3 () {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "beans4jdbc.xml"); // 트랜잭션 에이전트 Bean NewsDao Dao = (NewsDao) Ctx.getBean ( "NewsDao", NewsDao.class); DAO.INSERT ( "Java 프로그래밍의 핵심 아이디어", "경량 Java EE 개발"); System.out.println ( "실행 완료"); }테스트 방법을 실행하면 (중복 데이터로 인해) 예외가 발생하고 트랜잭션 제어로 인해 데이터베이스에 데이터 삽입이 없습니다.
위의 예에서 볼 수 있듯이 일반적으로 XML 스키마 구성에서 AOP 구성은 실제로 일반 Bean에 대해 수행되며 조언 향상이 통합됩니다. 조언 강화는 데이터 소스에 의존하는 트랜잭션 관리자로 구성됩니다.
<AOP : Advisor>의 경우, 조언과 진입 점의 바인딩은 스프링 하단 (BeannameaUutoProxyCreator, DefaultAdvisorAutoProxyCreator와 같은 Bean PostProcessor)에 의해 수행됩니다.
또한 <TX : 조언> 구성 향상에서 특정 예외가 발생하면 롤백 및 강제 롤백, 즉 Rollback-For = "XXXException", No-Rollback-For = "XXXException"을 지정할 수도 있습니다.
XML 스키마 방법을 사용하는 것 외에도이 방법에 트랜잭션 속성을 갖도록 메소드에 @transaction annotation을 직접 추가 할 수도 있습니다. @Transaction에서는 트랜잭션 (예 : 격리 속성, 전파 속성, 시간 초과, 읽기 전용 속성 등)에 대해 다양한 속성을 구성 할 수 있습니다. 또한 XML 구성에 A <TX : 주석 트리션 구성을 추가해야합니다. 이는 스프링이 주석에 따라 트랜잭션 에이전트를 구성하여 트랜잭션의 속성 구성과 AOP- 컷 구성 구성이 하나의 단계에서만 완료 될 수 있음을 나타냅니다 (메소드 이름의 주석 구성을 통해 직접).
<TX : 주석 중심의 트랜잭션-매너 = "TransactionManager" />
Newsdaoimpl.
@transactional (propagation = procagation.required, isplation = isplation.default, timeout = 5) @overridepublic void insert (문자열 제목, 문자열 내용) {위는 Spring의 트랜잭션 메커니즘 예제 코드에 대한이 기사의 전체 내용이며 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!