머리말
이 기사의 샘플 코드 다운로드 (SQL 파일을 포함하여 완전히 실행, 다운로드 후 데이터베이스 구성을 수정하십시오) : 다운로드하려면 여기를 클릭하십시오.
여러 데이터베이스 작업이 전체적으로 제어되며 함께 성공하거나 실패합니다.
원자력 : 거래가 분리 할 수없는 작업 단위이며 거래에서 운영이 발생하거나 발생하지 않습니다.
일관성 : 트랜잭션 전후에 데이터의 무결성이 일관성이 있어야 함을 의미합니다.
격리 : 여러 사용자가 데이터베이스에 동시에 액세스하면 한 사용자의 트랜잭션을 다른 사용자의 트랜잭션에 의해 방해 할 수 없으며 여러 동시 트랜잭션 간 데이터는 서로 격리되어야합니다.
지속성 : 일단 트랜잭션이 커지면 데이터베이스의 데이터 변경이 영구적이며 인스턴트 데이터베이스의 실패는 이에 영향을 미치지 않아야합니다.
-Platform TransactionManager Transaction Manager (Commit, Rollback Transactions)
Spring은 다양한 지속성 프레임 워크에 대한 다양한 플랫폼 TransactionManager 인터페이스 구현을 제공합니다. 좋다:
Spring JDBC 또는 Ibatis를 사용하여 데이터를 지속시 DataSourCetransactionManager 사용
영구 데이터에 Hibernate3.0을 사용할 때 HibernateTransactionManager를 사용하십시오
--transactionDefinition 트랜잭션 정의 정보 (격리, 전파, 시간 초과, 읽기 전용)
Dirty Reading : 한 거래는 다른 거래에서 다시 작성되었지만 아직 제출되지 않은 데이터를 읽습니다. 이 데이터가 롤백되면 읽기 데이터가 유효하지 않습니다.
반복적 인 읽기 없음 : 동일한 거래에서 동일한 데이터를 여러 번 읽음으로써 반환 된 결과는 다릅니다.
판타지 독서 : 한 번의 트랜잭션이 여러 줄의 레코드를 읽은 후에는 다른 트랜잭션이 일부 레코드를 삽입하고 판타지 독서가 발생합니다. 이후의 쿼리에서 첫 번째 트랜잭션에서는 원래 사용할 수없는 일부 레코드를 찾을 수 있습니다.
거래 격리 수준 : (5 가지 유형)
그 중에서 MySQL은 기본적으로 Returable_Read 분리 레벨을 사용합니다. Oracle은 기본적으로 read_committed 분리 레벨을 사용합니다
거래 커뮤니케이션 행동 : (7 가지 유형)
-TransactionStatus 트랜잭션 별 운영 상태
에이. 트랜잭션 관리 프로그래밍 (Java 프로그래밍 제어 기반, 드물게 사용)-Demo1 패키지 참조
TransactionTemplate을 사용하여 여러 DAO 작업을 캡슐화하십시오
*비. 선언 트랜잭션 관리 (스프링 기반 AOP 구성 제어)
- 트랜잭션 ProxyFactoryBean을 기반으로합니다. (거의 사용되지 않음)-Demo2 패키지를 참조하십시오
강화를 위해 트랜잭션 관리를 받고있는 각 클래스에 대해 트랜잭션 프로스크로 플로리 비앤비를 구성해야합니다.
-XML 구성에 기반을 둔 (자주 사용)-DEMO3 패키지를 참조하십시오
일단 구성되면 클래스에 추가 할 필요가 없습니다.
action이 트랜잭션을 입력하는 대상 객체 인 경우 <aop : config> 요소에 프록시-타겟 클래스 = "true"속성을 추가해야합니다. 그 이유는 Spring Framework에 CGLIB 기술을 사용하여 거래 관리 기능으로 작업 클래스를 생성하도록 알리기위한 것입니다.
-기반 주석 (간단한 구성, 자주 사용)-Demo4 패키지를 참조하십시오
ApplicationContext.xml에서 트랜잭션 주석 구성을 활성화합니다. (ApplicationContext.xml에서, Bean을 정의하고 다음 요소를 추가하십시오)
<bean id = "txmanager"> <property name = "sessionfactory"> </property> <tx : 주석 중심 트랜잭션-매너 = "txmanager"/>
클래스 전 또는 메소드 전에 정의 할 수있는 대상 구성 요소 클래스에서 @transactional을 사용하십시오.
--프로그램 작성
/ *** @description : 전송 케이스의 dao 계층 인터페이스**/ public interface AccountDao {/ *** @param out* : 송금 계정* @param money* : 송금 금액*/ public void outmone (문자열, 더블 머니); / ** * * @param in * : 송금 계정 * @param money * : 송금 금액 */ public void inmoney (문자열 in, double money); } / *** @description : 전송 사례의 DAO 계층 구현 클래스*/ public class arc this.getJdbctemplate (). update (sql, money, out); } / *** @param in* : 송금 계정* @param money* : 송금 금액* / @override public void inmoney (String in, double money) {String set set set money = money+? where name =? "; this.getjdbctemplate (). update (sql, money, in); }} / *** @description : 전송 사례의 비즈니스 인터페이스**/ public 인터페이스 계정 서비스 {/ *** @param out : 전송* @param in : 송금 계정* @param money : 송금 금액*/ public void chanlor (문자열 출력, 문자열 in, double money); } / *** @description : 전송 사례의 비즈니스 계층 구현 클래스*/ public class accountserviceimpl은 계정 서비스 {// dao private AccountDao AccountDao; // 트랜잭션 관리를위한 템플릿 개인 트랜잭션 플레이트 트랜잭션 플레이트; / ** * @param out * : 전송 * @param in * : 송금 계정 * @param money * : 송금 금액 */ @override public void chanfor (최종 문자열 출력, 최종 문자열 in, 최종 이중 돈) {// 프로세스 중 예외가 발생하면 이전 작업을 완료 할 수 있습니다. 후자가 할 수없는 경우, 전송은 성공했지만 이전은 수신되지 않습니다. // AccountDao.outMoney (Out, Money); // int i = 1/0; // AccountDao.inMoney (in, Money); TransactionTemplate.Execute (새로운 TransactionCallbackwithOUtresult () {@override protected void dointransactionwithoutresult (transactionstatus transactionstatus) {ac AccountDao.inmoney (in, Money); } public void setAccountdao (AccountDao AccountDao) {this.accountdao = AccountDao; } public void settransactionTemplate (TransactionTemplate TransactionTemplate) {this.transactionTemplate = TransactionTemplate; }}ApplicationContext1.xml
<!-외부 속성 파일 소개-> <context : property-placeholder location = "classpath : jdbc.properties" /> <!-c3p0 연결 풀-> <bean id = "dataSource"> <property name = "driverclass"value = "$ {jdbc.driverclass}" /> <property name = "jdbcurl" value = "$ {jdbc.url}" /> <속성 이름 = "user"value = "$ {jdbc.username}" /> <속성 이름 = "password"vale = "$ {jdbc.password}" /> < /bean> <! < /bean> <! <!-트랜잭션 관리에 대한 템플릿을 주입합니다-> <속성 이름 = "transactionTemplate"ref = "transactionTemplate" /> < /bean> <!-DAO 클래스를 구성합니다 (단순화, jdbctemplate는 자동으로 구성 될 것입니다)-> <bean id = "Accountdao"> <속성 이름 = "dataSource"ref = "datasource" /> < /bean>-구성. (단순화되지 않음)-> <!-<bean id = "jdbctemplate"> <property name = "dataSource"ref = "dataSource" /< /bean> <bean id = "AccountDao"> <Property Name = "jdbctemplate"ref = "jdbctemplate" /> --> <! ============================================================================================================================================== ============================================================================================================================================== ============================================================================================================================================== ============================================================================================================================================== 트랜잭션 관리 템플릿 구성 : 트랜잭션 관리 코드를 단순화하기 위해 스프링이 제공하는 클래스 -> <bean id = "transactionTemplate"> <속성 이름 = "TransactionManager"ref = "TransactionManager"/> </bean>시험:
@RunWith (SpringJunit4classRunner.class) @contextConfiguration ( "ClassPath : ApplicationContext1.xml") 공개 클래스 트랜잭션 테스트 {@Resource (name = "accountservice") 개인 계정 계정; @test public void demo1 () {ac }}-TransactionProxyFactoryBean을 기반으로 한 메소드
공개 클래스 계정 erviceimpl은 계정 서비스 {// dao private AccountDao AccountDao; / ** * @param out * : 송금 * @param in * : 송금 계정 * @param money * : 송금 금액 */ @override public void 이전 (문자열 출력, 문자열 in, double money) {Acc // int i = 1/0; AccountDao.inmoney (In, Money); } public void setAccountdao (AccountDao AccountDao) {this.accountdao = AccountDao; }}ApplicationContext2.xml
<!-외부 속성 파일 소개-> <context : property-placeholder location = "classpath : jdbc.properties" /> <!-c3p0 연결 풀-> <bean id = "dataSource"> <property name = "driverclass"value = "$ {jdbc.driverclass}" /> <property name = "jdbcurl" value = "$ {jdbc.url}" /> <속성 이름 = "user"value = "$ {jdbc.username}" /> <속성 이름 = "password"vale = "$ {jdbc.password}" /> < /bean> <! < /bean> <! </bean> <!-DAO 클래스를 구성합니다 (단순화, jdbctemplate 자동으로 자동 구성)-> <bean id = "AccountDao"> <property name = "dataSource"ref = "dataSource"/> </bean> <!- ================================================================================================================================================ ========================================================================================================================================= ================================================================================================================================================ ========================================================================================================================================= -> <!-트랜잭션 관리자 구성-> <bean id = "transactionManager"> <property name = "dataSource"ref = "dataSource" /< /bean> <!-비즈니스 계층의 프록시를 구성-> <bean id = "ac <property name = "transactionManager"ref = "transactionManager"> </property> <!-트랜잭션 속성을 주입-> <속성 이름 = "transactionAttributes"> <props> <!-propgation :* 전파 : 거래 분리 수준 : 트랜잭션 롤링*-예외 : +예외 : +예외적 인 경우 : <prop key = "transfer"> propagation_required </prop> <!-<prop key = "transfer"> propagation_required, readonly </prop>-> <!-<prop key = "transfer"> propagation_required, readonly </prop>-> <!-<props "> propagation_required,+java.lang. </props> </property> </bean>시험:
@RunWith (SpringJunit4classRunner.class) @ContextConfiguration ( "ClassPath : ApplicationContext2.xml") 공개 클래스 트랜잭션 테스트 { / *** 프록시 클래스를 주입해야합니다. 프록시 클래스가 향상된 운영* / //resource (name = accountservice ") @name (name =") 계정 서비스 계정 서비스; @test public void demo1 () {ac }}-XML 구성 기반
공개 클래스 계정 erviceimpl은 계정 서비스 {// dao private AccountDao AccountDao; / ** * @param out * : 송금 * @param in * : 송금 계정 * @param money * : 송금 금액 */ @override public void 이전 (문자열 출력, 문자열 in, double money) {Acc // int i = 1/0; AccountDao.inmoney (In, Money); } public void setAccountdao (AccountDao AccountDao) {this.accountdao = AccountDao; }}ApplicationContext3.xml
<!-외부 속성 파일 소개-> <context : property-placeholder location = "classpath : jdbc.properties" /> <!-c3p0 연결 풀-> <bean id = "dataSource"> <property name = "driverclass"value = "$ {jdbc.driverclass}" /> <property name = "jdbcurl" value = "$ {jdbc.url}" /> <속성 이름 = "user"value = "$ {jdbc.username}" /> <속성 이름 = "password"vale = "$ {jdbc.password}" /> < /bean> <! < /bean> <! </bean> <!-DAO 클래스를 구성합니다 (단순화, jdbctemplate 자동으로 자동 구성)-> <bean id = "AccountDao"> <property name = "dataSource"ref = "dataSource"/> </bean> <!- =========================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== : 트랜잭션 전파 동작 격리 : 트랜잭션 격리 수준 읽기 전용 : 읽기 전용 롤백 : 예외가 발생하지 않은 예외가 발생하지 않았습니다. point-> <aop : pointcut expression = "execution (* com.zs.spring.demo3.accountservice+.시험:
/ *** @description : Spring의 선언 트랜잭션 관리 방법 2 : Spring의 선언적 트랜잭션 관리 방법 2 : SPINGJ 기반 XML 구성*/ @RUNWITH (SPRINGJUNIT4CLASSRUNNER.CLASS) @ContextConfiguration ( "ClassPath : ApplicationContext3.xml") 공개 클래스 트랜잭션 {/ *** Prox Classe (Same Operations*/ @ @ @ @ @ @renged). "계정 서비스") 개인 계정 서비스 계정 서비스; @test public void demo1 () {ac }}-주석 기반
/ *** @Transactional Provagation : 거래 전파 행동 격리 : 거래 격리 수준도 읽기 : 읽기 전용* Rollbackfor : Norollbackfor : 예외가 발생하지 않은 예외가 발생하지 않은 예외*/ @transactional (propagation = properatation.required, readeGaultation, depaultation. AccountserViceImpl은 계정 서비스 {// dao 주입 전송 개인 계정 계정; / *** @param out* : 전송 계정* @param in* : 송금 계정* @param money* : 송금 금액*/ @override public void 이전 (문자열 출력, 문자열 in, double money) {Accoundao.outmoney (out, money); // int i = 1/0; AccountDao.inmoney (In, Money); } public void setAccountdao (AccountDao AccountDao) {this.accountdao = AccountDao; }}ApplicationContext4.xml
<!-외부 속성 파일 소개-> <context : property-placeholder location = "classpath : jdbc.properties" /> <!-c3p0 연결 풀-> <bean id = "dataSource"> <property name = "driverclass"value = "$ {jdbc.driverclass}" /> <property name = "jdbcurl" value = "$ {jdbc.url}" /> <속성 이름 = "user"value = "$ {jdbc.username}" /> <속성 이름 = "password"vale = "$ {jdbc.password}" /> < /bean> <! < /bean> <! </bean> <!-DAO 클래스를 구성합니다 (단순화, jdbctemplate 자동으로 자동 구성)-> <bean id = "AccountDao"> <property name = "dataSource"ref = "dataSource"/> </bean> <!- ================================================================================================================================================ ========================================================================================================================================= ================================================================================================================================================ ========================================================================================================================================= 트랜잭션 관리자 구성-> <bean id = "transactionManager"> <property name = "dataSource"ref = "dataSource"/> </bean> <!-주석 트랜잭션 켜기-> <tx : 주석 구동 트랜잭션-매너 = "transactionManager"/>시험:
@RunWith (SpringJunit4classRunner.class) @contextConfiguration ( "ClassPath : ApplicationContext4.xml") 공개 클래스 트랜잭션 테스트 { / *** 프록시 클래스를 주입해야합니다. 프록시 클래스가 강화 된 작업을 수행하기 때문에* / @Resource (name = "AccountsErvice") Accuments Accountservervice; @test public void demo1 () {ac }}특정 코드 및 데이터베이스 파일 참조 프로젝트 완료 코드 :
http://xiazai.vevb.com/201805/yuanma/spring-transaction_jb51.rar
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.