callable 인터페이스를 사용하여 serviceImpl에 멀티 스레딩 프로그램을 작성 중입니다. 스프링 트랜잭션 관리자를 사용하고 있습니다. DB에서 업데이트 작업을 실행하면 성공적으로 실행됩니다. 그러나 업데이트 된 데이터는 DB에 반영되지 않습니다. 하지만 멀티 쓰레딩없이 프로그램을 실행하면 데이터베이스에 업데이트됩니다.스프링 트랜잭션 관리자와 멀티 스레딩
이 내 구성
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" />
<tx:method name="find*" propagation="NOT_SUPPORTED" />
<tx:method name="get*" propagation="NOT_SUPPORTED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceOperation" expression="execution(* *..*ServiceImpl.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
</aop:config>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
나는이 방법은 멀티 스레딩 지원 아닌지 확인하고 싶지 거래 manager.Just에 대한 또 다른 접근 방식으로 전환 할 수있다. 내 질문은 스프링 트랜잭션 관리자가 멀티 스레드를 지원합니까 (주석 또는 XML 선언을 의미하는 것입니까?) 업데이트 된 데이터가 필자의 경우 DB에 반영되지 않는 이유는 무엇입니까? 가장 좋은 대안은 무엇일까요?
활성 트랜잭션을 두 번째 스레드로 전달할 수 있습니까? –
나는 그것을 의심한다. 트랜잭션 측면에서 두 번째 스레드가 트랜잭션을 완료했는지 여부를 어떻게 알 수 있습니까? 스폰 된 스레드 (또는 호출 가능 객체)가 작업을 완료하기 전에 메소드가 리턴하면 누가 트랜잭션을 완결 할 것입니까? –
그런 식으로하면 스레드의 적절한 동기화를 담당합니다. 예를 들어 스레드 A에서 작업을 시작하고 스레드 B에서 완료하는 것이 유용 할 수 있습니다 (따라서 스레드간에 트랜잭션 전달). –