SPRING 사무 실현

5743 단어 봄 사무
트 랜 잭 션 전파 행위 종류
Spring 은 TransactionDefinition 인터페이스 에서 7 가지 유형의 사무 전파 행 위 를 규정 했다.
그들 은 사무 방법 과 사무 방법 이 내장 호출 이 발생 할 때 사 무 를 어떻게 전파 하 는 지 규정 했다.
표 1 사무 전파 행위 유형
트 랜 잭 션 전파 행위 유형
설명 하 다.
PROPAGATION_REQUIRED
현재 트 랜 잭 션 이 없 으 면 새 트 랜 잭 션 을 만 듭 니 다. 하나의 트 랜 잭 션 이 존재 한다 면 이 트 랜 잭 션 에 가입 하 십시오.이것 은 가장 흔히 볼 수 있 는 선택 이다.
PROPAGATION_SUPPORTS
현재 트 랜 잭 션 을 지원 합 니 다. 현재 트 랜 잭 션 이 없 으 면 비 트 랜 잭 션 으로 실 행 됩 니 다.
PROPAGATION_MANDATORY
현재 트 랜 잭 션 을 사용 합 니 다. 현재 트 랜 잭 션 이 없 으 면 이상 을 던 집 니 다.
PROPAGATION_REQUIRES_NEW
새 트 랜 잭 션, 현재 트 랜 잭 션 이 존재 하면 현재 트 랜 잭 션 을 걸 어 놓 습 니 다.
PROPAGATION_NOT_SUPPORTED
비 사무 방식 으로 작업 을 수행 합 니 다. 현재 사무 가 존재 하면 현재 사 무 를 걸 어 놓 습 니 다.
PROPAGATION_NEVER
비 사무 방식 으로 실행 되 며, 현재 사무 가 존재 한다 면 이상 을 던 집 니 다.
PROPAGATION_NESTED
현재 트 랜 잭 션 이 존재 한다 면, 포 함 된 트 랜 잭 션 에서 실 행 됩 니 다.현재 트 랜 잭 션 이 없 으 면 PROPAGATION 을 실행 합 니 다.REQUIRED 와 유사 한 동작 입 니 다.
 
ibatis spring 트 랜 잭 션 구현 1. 동적 데이터 원본 설정 - KEY 경로 에 따라
<bean id="dataSource" class="com.xiao.AbstractRoutingDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="db2" value-ref="ds-db2" />
                <entry key="sqlserver" value-ref="ds-sql" />
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="ds-db2" />
    </bean>  

   2. 트 랜 잭 션 설정
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="Throwable" />
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="Throwable" />
            <tx:method name="update*" propagation="REQUIRED" rollback-for="Throwable" />
            <tx:method name="toggle*" propagation="REQUIRED" rollback-for="Throwable" />
            <tx:method name="query*" read-only="true" />
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="servicePointcut" expression="execution(* com.xiao..*ServiceImpl.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut" />
        <!-- <aop:advisor advice-ref="txAdvice" pointcut-ref="otherPointcut" /> -->
</aop:config>

 3. IBATIS 설정
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocations">
            <list>
                <value>classpath:/com/xiao/sqlmap-config.xml</value>
               
            </list>
        </property>
        <property name="dataSource" ref="dataSource" />
        <property name="lobHandler" ref="lobHandler" />
</bean>

4. 트 랜 잭 션 설정 XML 추가  구현 클래스 에 이 @ Transactional (propagation = Propagation. NOT SUPPORTED, rollback For = Runtime Exception. class) 문 제 를 추가 합 니 다. 트 랜 잭 션 방법 에서 여러 DAO 의 연결 은 같은 connection 을 사용 해 야 합 니 다. SPRING 은 어떻게 sqlMapClient 의 connection 과 transactionManager 를 일치 시 킵 니까?분석: 같은 데이터 소스 를 사용 하 는 것 을 볼 수 있 습 니 다.Sql MapClient Factory Bean. after PropertiesSet 에 서 는 datasource 를 Transaction AwareDataSourceProxy 에이전트 로 패키지 합 니 다.getConnection 방법 을 대 리 했 습 니 다.자세 한 내용 은 DataSourceUtils. doGetConnection 을 참조 하 십시오. 이 방법 은 현재 스 레 드 에서 스 레 드 로 컬 데이터 (ThreadLocal) MAP, key 를 데이터 원본 으로 하고 값 은 연결 입 니 다. 이것 이 트 랜 잭 션 이 라면 트 랜 잭 션 의 AOP 는 트 랜 잭 션 방법 에 들 어가 기 전에 이 연결 을 넣 습 니 다.그래서 연결 이 같은 거 예요.문제: 트 랜 잭 션 에서 동적 데이터 원본 전환 이 소 용이 없 습 니까?분석: 위의 분석 에 따 르 면 연결 을 취 할 때 사무 방법 에 들 어가 기 전에 설 치 된 연결 을 취하 기 때문에 안 됩 니 다.AbstractRouting DataSource 는 실제 getConnection 방법 으로 데이터 원본 을 동적 으로 전환 하지만 이 방법 은 대리 되 었 습 니 다.XML 에서 설정 한 DAO 와 트 랜 잭 션 의 데이터 원본 은 같 습 니 다.트 랜 잭 션 분석: TransactionInterceptor 차단 트 랜 잭 션 방법, 첫 번 째 진입, 현재 스 레 드 에 대응 하 는 ConnectionHolder 가 비어 있 습 니 다. doBegin 방법 을 호출 하여 새로운 데이터베이스 연결 ConnectionHolder 를 생 성 합 니 다. 트 랜 잭 션 클래스 는 new ConnectionHolder 속성 을 TRUE 로 설정 하고 이 Transact 를 첫 번 째 로 표시 합 니 다. 첫 번 째 Transact 라면 ConnectionHolder 를 연결 합 니 다.스 레 드 로 컬 컨 텍스트 에 사무 방법 에 포 함 된 사무 상황 이 있다 면 전파 단 계 는 PROPAGATION 이 라 고 가정 합 니 다.REQUIRED (이전 트 랜 잭 션 으로) 포 함 된 트 랜 잭 션 방법 에 들 어 갔 을 때 연결 은 처음 Connection Holder 이지 만 Transact 류 는 new Transaction false (트 랜 잭 션 을 제출 할 지 여 부 를 구분 하 는 데 사용) 로 설정 되 어 있 습 니 다.Propagation.NOT_SUPPORTED: 이전 사 무 를 걸 고 현재 스 레 드 의 연결 을 비 웁 니 다.NOT_SUPPORTED 방법의 후속 SQL 은 바로 제출 되 며, 앞 뒤로 작 동 하 는 SQL 이 같은 데이터 일 경우 잠 금 이 걸 리 고 앞 에 있 는 사무 가 잠 겨 있어 후속 사 무 를 제출 할 수 없습니다.Propagation.REQUIRES_NEW: 이전 트 랜 잭 션 을 걸 고 새 트 랜 잭 션 을 만 들 것 입 니 다. 현재 스 레 드 의 연결 은 새로운 트 랜 잭 션 의 데이터베이스 연결 로 설정 합 니 다.새 트 랜 잭 션 을 제출 한 후 이전 트 랜 잭 션 을 복원 합 니 다. 현재 스 레 드 의 데이터베이스 연결 은 트 랜 잭 션 을 복원 하 는 연결 로 설정 되 어 있 습 니 다.첫 번 째 사 무 를 보장 하 는 SQL 은 같은 연결 을 사용 합 니 다.

좋은 웹페이지 즐겨찾기