Spring 에서 사무 관리의 네 가지 방법(은행 이체 의 경우)

머리말
본 고 는 예제 코드 다운로드 주소(완전 실행 가능,sql 파일 포함,다운로드 후 데이터베이스 설정 을 수정 하 십시오):여 기 를 클릭 하여 다운로드
일의 역할
  몇몇 데이터 베 이 스 를 하나의 전체 제어 로 하여 함께 성공 하거나 함께 실패 합 니 다.
  원자 성:사 무 는 분리 할 수 없 는 업무 단위 로 업무 중의 조작 이 모두 발생 하거나 발생 하지 않 는 다 는 것 을 말한다.
  일치 성:업무 전후 데이터 의 완전 성 이 일치 해 야 한 다 는 것 을 말한다.
  격 리 성:여러 사용자 가 동시에 데이터 베 이 스 를 방문 할 때 한 사용자 의 업 무 는 다른 사용자 의 사무실 에 의 해 방 해 를 받 지 못 하고 여러 개의 병행 업무 간 의 데 이 터 는 서로 격 리 되 어야 한 다 는 것 을 말한다.
  지속 성:하나의 업무 가 제출 되면 데이터 베이스 에 대한 변 화 는 영구적 인 것 이 고 실시 간 데이터 베이스 가 고장 나 도 이에 영향 을 주지 말 아야 한 다 는 것 을 말한다.
2.Spring 사무 관리 고위 층 추상 화 는 주로 3 개의 인 터 페 이 스 를 포함한다.
  --Platform TransactionManager 트 랜 잭 션 관리자(제출,스크롤 백 트 랜 잭 션)
     Spring 은 서로 다른 지구 화 프레임 워 크 에 서로 다른 Platform TransactionManager 인 터 페 이 스 를 제공 합 니 다.예:
        Spring JDBC 또는 iBatis 를 사용 하여 지속 적 인 데 이 터 를 진행 할 때 DataSourceTransactionManager 를 사용 합 니 다.
        Hibernate 3.0 버 전 으로 데이터 영구 화 시 HibernateTransactionManager 사용
  --TransactionDefinition 트 랜 잭 션 정의 정보(격 리,전파,시간 초과,읽 기 전용)
        더러 운 읽 기:한 사 무 는 다른 사 무 를 읽 고 바 꾸 었 으 나 아직 제출 되 지 않 은 데 이 터 를 읽 었 습 니 다.이 데이터 가 스크롤 백 되면 읽 은 데 이 터 는 유효 하지 않 습 니 다.
        중복 읽 을 수 없습니다:같은 사무 에서 같은 데 이 터 를 여러 번 읽 고 돌아 오 는 결과 가 다 릅 니 다.
        환 독:한 사무 가 몇 줄 의 기록 을 읽 은 후에 다른 사무 가 기록 을 삽입 하면 환 독 이 발생 합 니 다.이후 의 조회 에서 첫 번 째 사 무 는 원래 없 었 던 기록 들 을 발견 할 수 있 을 것 이다.
        트 랜 잭 션 격 리 단계:(5 가지)
  •     DEFAULT--백 엔 드 데이터 베 이 스 를 사용 하 는 기본 격 리 단계(Spring 의 선택 항목)
  •     READ_UNCOMMITED-제출 하지 않 은 변 경 된 데 이 터 를 읽 을 수 있 습 니 다.더 럽 고 환상 적 이 며 중복 읽 을 수 없 음
  •     READ_COMMITTED-동시 다발 업무 가 제출 된 후에 읽 을 수 있 습 니 다.더러 운 독 서 를 방지 할 수 있 으 나,환 독 과 중복 독 서 는 여전히 발생 할 수 있다
  • .
  •     REPEATABLE_READ-데이터 가 사무 자체 에 의 해 바 뀌 지 않 는 한 같은 필드 를 여러 번 읽 는 것 은 일치 합 니 다.더러 운 것 을 방지 하고 중복 읽 을 수 없 지만 환 독 은 여전히 발생 할 수 있다
  • .
  •     SERIALIZABLE-ACID 의 격 리 단계 에 완전히 복종 하여 더 럽 고 환상 적 이 며 중복 읽 을 수 없 도록 확보한다.이것 은 모든 격 리 단계 에서 가장 느 린 것 으로 업무 와 관련 된 데이터 시트 를 완전히 잠 그 는 전형 적 인 것 이다.
  •     그 중에서 MySQL 은 기본적으로 REPEATABLE 를 사용 합 니 다.READ 격 리 단계;Oracle 은 기본적으로 READ 를 사용 합 니 다.COMMITTED 격 리 단계
            트 랜 잭 션 전파 행위:(7 가지)
  •     REQUIRED-현재 트 랜 잭 션 을 지원 합 니 다.현재 트 랜 잭 션 이 없 으 면 새 트 랜 잭 션 을 만 듭 니 다.이것 은 가장 흔히 볼 수 있 는 선택 이다.4567918)
  •     지원 TS-현재 트 랜 잭 션 을 지원 합 니 다.현재 트 랜 잭 션 이 없 으 면 비 트 랜 잭 션 으로 실행 합 니 다.
  •     MANDATORY-현재 트 랜 잭 션 을 지원 합 니 다.현재 트 랜 잭 션 이 없 으 면 이상 을 던 집 니 다.
  •     REQUIRES_NEW--새 트 랜 잭 션,현재 트 랜 잭 션 이 존재 하면 현재 트 랜 잭 션 을 걸 어 놓 습 니 다.
  •     NOT_SUPPORTED-비 사무 적 으로 작업 을 수행 합 니 다.현재 업무 가 존재 하면 현재 업 무 를 연결 합 니 다.
  •     NEVER--비 사무 적 으로 실행 되 며,현재 사무 가 존재 하면 이상 을 던 집 니 다.
  •     NESTED--현재 트 랜 잭 션 이 존재 한다 면 포 함 된 트 랜 잭 션 에서 실 행 됩 니 다.현재 트 랜 잭 션 이 없 으 면 REQUIRED 와 유사 한 동작 을 수행 합 니 다.스크롤 백 할 수 있 는 저장 점 이 여러 개 있 으 며 내부 스크롤 백 은 외부 업무 에 영향 을 주지 않 습 니 다.DataSourceTransactionManager 에 만 유효 합 니 다
  •   --TransactionStatus 트 랜 잭 션 구체 적 인 실행 상태
    3.Spring 은 다음 과 같은 방법 으로 업 무 를 통제 합 니 다.
      a.프로 그래 밍 식 사무 관리(자바 프로 그래 밍 제어 기반,거의 사용 되 지 않 음)--demo 1 패키지 참조
           TransactionTemplate 를 이용 하여 여러 DAO 작업 을 봉인 합 니 다.
      *b.성명 식 사무 관리(Spring 기반 AOP 설정 제어)
           -TransactionProxy Factory Bean 방식 을 기반 으로 합 니 다.(거의 사용 되 지 않 음)--demo 2 패키지 참조
                트 랜 잭 션 관리 클래스 마다 TransactionProxy Factory Bean 을 설정 하여 강화 해 야 합 니 다.
           -XML 설정 기반(자주 사용)--demo 3 패키지 참조
                일단 설정 이 다 되면 클래스 에 아무것도 추가 할 필요 가 없습니다.
                Action 이 대상 으로 사 무 를 삽입 하려 면요소 에 proxy-target-class="true"속성 을 추가 해 야 합 니 다.Spring 프레임 워 크 에 CGLIB 기술 로 사무 관리 기능 을 가 진 Action 류 를 생 성 하 라 고 알 리 기 때문이다.
           -주석 기반(설정 이 간단 하고 자주 사용)--demo 4 패키지 참조
                applicationContext.xml 에서 트 랜 잭 션 주석 설정 을 엽 니 다.(applicationContext.xml 에서 Bean 을 정의 하고 다음 요 소 를 추가 합 니 다)
    
    <bean id="txManager" class="...">
     <property name="sessionFactory">
     </property>
    <tx:annotation-driven transaction-manager="txManager"/>
                대상 구성 요소 클래스 에서@Transactional 을 사용 합 니 다.이 표 시 는 클래스 앞 이나 방법 앞 에 정의 할 수 있 습 니 다.
    4.예시(은행 이체)
            --프로 그래 밍 식
    
    /** 
     * @Description:     DAO    
     * 
     */ 
    public interface AccountDao { 
     /** 
     * @param out 
     * :     
     * @param money 
     * :     
     */ 
     public void outMoney(String out, Double money); 
     
     /** 
     * 
     * @param in 
     * :     
     * @param money 
     * :     
     */ 
     public void inMoney(String in, Double money); 
    } 
    
    /** 
     * @Description:     DAO     
     */ 
    public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { 
     /** 
     * @param out 
     * :     
     * @param money 
     * :     
     */ 
     @Override 
     public void outMoney(String out, Double money) { 
     String sql = "update account set money = money-? where name = ?"; 
     this.getJdbcTemplate().update(sql, money, out); 
     } 
     /** 
     * @param in 
     * :     
     * @param money 
     * :     
     */ 
     @Override 
     public void inMoney(String in, Double money) { 
     String sql = "update account set money = money+? where name = ?"; 
     this.getJdbcTemplate().update(sql, money, in); 
     } 
    } 
    
    /** 
     * @Description:          
     * 
     */ 
    public interface AccountService { 
     /** 
     * @param out :     
     * @param in :     
     * @param money :     
     */ 
     public void transfer(String out,String in,Double money); 
    } 
    
    /** 
     * @Description:            
     */ 
    public class AccountServiceImpl implements AccountService { 
     //      DAO 
     private AccountDao accountDao; 
     
     //           
     private TransactionTemplate transactionTemplate; 
     
     /** 
     * @param out 
     * :     
     * @param in 
     * :     
     * @param money 
     * :     
     */ 
     @Override 
     public void transfer(final String out, final String in, final Double money) { 
     
     //              ,        ,           ,     ,             
     // accountDao.outMoney(out, money); 
     // int i = 1/0; 
     // accountDao.inMoney(in, money); 
     
     transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
     
     @Override 
     protected void doInTransactionWithoutResult( 
      TransactionStatus transactionStatus) { 
     accountDao.outMoney(out, money); 
     // int i = 1 / 0;//    ,     ,           
     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" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <property name="driverClass" value="${jdbc.driverClass}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
     </bean> 
     
     <!--        --> 
     <bean id="accountService" class="com.zs.spring.demo1.AccountServiceImpl"> 
     <property name="accountDao" ref="accountDao" /> 
     <!--           --> 
     <property name="transactionTemplate" ref="transactionTemplate" /> 
     </bean> 
     
     <!--   DAO (  ,     JdbcTemplate) --> 
     <bean id="accountDao" class="com.zs.spring.demo1.AccountDaoImpl"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     
     <!--   DAO (   ) --> 
     <!-- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     <bean id="accountDao" class="com.zs.spring.demo1.AccountDaoImpl"> 
     <property name="jdbcTemplate" ref="jdbcTemplate" /> 
     </bean> --> 
     
     <!-- ==================================1.        =============================================== --> 
     <!--         --> 
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     
     <!--          :Spring                 --> 
     <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> 
     <property name="transactionManager" ref="transactionManager"/> 
     </bean> 
    테스트:
    
    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration("classpath:applicationContext1.xml") 
    public class TransactionTest { 
     @Resource(name = "accountService") 
     private AccountService accountService; 
     
     @Test 
     public void demo1() { 
     accountService.transfer("aaa", "bbb", 200d); 
     } 
    } 
        --TransactionProxy Factory Bean 기반 방식
    
    public class AccountServiceImpl implements AccountService { 
     //      DAO 
     private AccountDao accountDao; 
     
     /** 
     * @param out 
     *  :     
     * @param in 
     *  :     
     * @param money 
     *  :     
     */ 
     @Override 
     public void transfer(String out, String in, Double money) { 
     accountDao.outMoney(out, money); 
     // 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" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <property name="driverClass" value="${jdbc.driverClass}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
     </bean> 
     
     <!--        --> 
     <bean id="accountService" class="com.zs.spring.demo2.AccountServiceImpl"> 
     <property name="accountDao" ref="accountDao" /> 
     </bean> 
     
     <!--   DAO (  ,     JdbcTemplate) --> 
     <bean id="accountDao" class="com.zs.spring.demo2.AccountDaoImpl"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     
     <!-- ==================================2.  XML          (    )=============================================== --> 
     
     <!--         --> 
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     
     <!--          --> 
     <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
     <!--        --> 
     <property name="target" ref="accountService" /> 
     <!--         --> 
     <property name="transactionManager" ref="transactionManager"></property> 
     <!--         --> 
     <property name="transactionAttributes"> 
      <props> 
      <!-- 
       prop   : 
       * PROPAGATION :        
       * ISOTATION :        
       * readOnly :   
       * -EXCEPTION :           
       * +EXCEPTION :            
       --> 
      <prop key="transfer">PROPAGATION_REQUIRED</prop> 
      <!-- <prop key="transfer">PROPAGATION_REQUIRED,readOnly</prop> --> 
      <!-- <prop key="transfer">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> --> 
      </props> 
     </property> 
     </bean> 
    테스트:
    
    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration("classpath:applicationContext2.xml") 
    public class TransactionTest { 
     /** 
     *         :             
     */ 
     // @Resource(name="accountService") 
     @Resource(name = "accountServiceProxy") 
     private AccountService accountService; 
     
     @Test 
     public void demo1() { 
     accountService.transfer("aaa", "bbb", 200d); 
     } 
    } 
        --XML 기반 설정
    
    public class AccountServiceImpl implements AccountService { 
     //      DAO 
     private AccountDao accountDao; 
     
     /** 
     * @param out 
     *  :     
     * @param in 
     *  :     
     * @param money 
     *  :     
     */ 
     @Override 
     public void transfer(String out, String in, Double money) { 
     accountDao.outMoney(out, money); 
     // 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" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <property name="driverClass" value="${jdbc.driverClass}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
     </bean> 
     
     <!--        --> 
     <bean id="accountService" class="com.zs.spring.demo3.AccountServiceImpl"> 
     <property name="accountDao" ref="accountDao" /> 
     </bean> 
     
     <!--   DAO (  ,     JdbcTemplate) --> 
     <bean id="accountDao" class="com.zs.spring.demo3.AccountDaoImpl"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     
     <!-- ==================================3.  XML          ,  tx/aop=============================================== --> 
     
     <!--         --> 
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     
     <!--         --> 
     <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
     <tx:attributes> 
      <!-- 
      propagation :       
      isolation :        
      read-only :   
      rollback-for:         
      no-rollback-for :          
      timeout :     
      --> 
      <tx:method name="transfer" propagation="REQUIRED"/> 
     </tx:attributes> 
     </tx:advice> 
     
     <!--      --> 
     <aop:config> 
     <!--       --> 
     <aop:pointcut expression="execution(* com.zs.spring.demo3.AccountService+.*(..))" id="pointcut1"/> 
     <!--      --> 
     <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> 
     </aop:config> 
    테스트:
    
    /** 
     * @Description:Spring            :  AspectJ XML      
     */ 
    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration("classpath:applicationContext3.xml") 
    public class TransactionTest { 
     /** 
     *         :             
     */ 
     @Resource(name = "accountService") 
     private AccountService accountService; 
     
     @Test 
     public void demo1() { 
     accountService.transfer("aaa", "bbb", 200d); 
     } 
    } 
        --주해 에 기초 하 다
    
    /** 
     * @Transactional      propagation :        isolation :        readOnly :   
     *   rollbackFor :         noRollbackFor :          
     *   rollbackForClassName          
     */ 
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false) 
    public class AccountServiceImpl implements AccountService { 
     //      DAO 
     private AccountDao accountDao; 
     
     /** 
     * @param out 
     *  :     
     * @param in 
     *  :     
     * @param money 
     *  :     
     */ 
     @Override 
     public void transfer(String out, String in, Double money) { 
     accountDao.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" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <property name="driverClass" value="${jdbc.driverClass}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
     </bean> 
     
     <!--        --> 
     <bean id="accountService" class="com.zs.spring.demo4.AccountServiceImpl"> 
     <property name="accountDao" ref="accountDao" /> 
     </bean> 
     
     <!--   DAO (  ,     JdbcTemplate) --> 
     <bean id="accountDao" class="com.zs.spring.demo4.AccountDaoImpl"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     
     <!-- ==================================4.           ============================================ --> 
     
     <!--         --> 
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
     </bean> 
     
     <!--        --> 
     <tx:annotation-driven transaction-manager="transactionManager"/> 
    테스트:
    
    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration("classpath:applicationContext4.xml") 
    public class TransactionTest { 
     /** 
     *         :             
     */ 
     @Resource(name = "accountService") 
     private AccountService accountService; 
     
     @Test 
     public void demo1() { 
     accountService.transfer("aaa", "bbb", 200d); 
     } 
    } 
    구체 적 인 코드 와 데이터베이스 파일 참조 항목 의 전체 코드:
    http://xiazai.jb51.net/201805/yuanma/Spring-transaction_jb51.rar
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기