1. mybatis 만 사용하는 경우 SQLSESSION을 사용하여 트랜잭션을 처리합니다.
공개 클래스 MyBatistXtest {private static sqlsessionFactory sqlsessionFactory; 개인 정적 독자 독자; @beforeclass public static void setupbeforeclass ()는 예외 {try {reader = resources.getResourceAsReader ( "configuration.xml"); sqlsessionFactory = new SqlSessionFactoryBuilder (). 빌드 (Reader); } 마침내 {if (reader! = null) {reader.close (); }}} @test public void updateUserTxtStest () {sqlsession session = sqlsessionfactory.opensession (false); // 세션을 열면 트랜잭션이 시작됩니다. {iuserMapper mapper = session.getMapper (iusermapper.class); 사용자 사용자 = 새 사용자 (9, "테스트 트랜잭션"); int inffectedCount = mapper.updateUser (사용자); // 후속 예외 사용자 user = 새 사용자 (10, "지속적으로 테스트 트랜잭션")로 인해 커밋 문이 실행되지 않았습니다. int inffectedCount2 = mapper.upDateUser (user2); // Commit 문 INT I = 2 / 0은 후속 예외로 인해 실행되지 않습니다. // 런타임 예외는 트리거 된 session.commit (); // 세션을 제출합니다. 즉, 트랜잭션 커밋} 마지막으로 {session.close (); // 세션을 닫고 릴리스 리소스}}}
2. Spring과 통합 후 Spring의 거래 관리를 사용하십시오.
Mybatis-Spring을 사용하는 주된 이유 중 하나는 Mybatis가 Spring의 거래 관리에 참여할 수 있기 때문입니다. Mybatis-Spring은 MyBatis 용 새로운 특정 트랜잭션 관리자를 작성하는 대신 봄에 존재하는 DataSourcetransactionManager를 사용합니다.
DataSourCetransactionManager가 구성되면 평소와 같이 스프링에서 트랜잭션을 구성 할 수 있습니다. @transactional 주석 및 AOP 스타일 구성이 지원됩니다. 트랜잭션 처리 중에 별도의 SQLSESSION 객체가 생성되고 사용됩니다. 거래가 완료되면이 세션은 적절한 방식으로 커밋되거나 롤백됩니다.
거래가 만들어지면 Mybatis-Spring은 투명하게 거래를 관리합니다. DAO 또는 서비스 클래스에는 추가 코드가 필요하지 않습니다.
1. 표준 구성
Spring의 트랜잭션 처리를 활성화하려면 Spring의 XML 구성 파일에서 DataSourCetransactionManager 객체를 만듭니다.
<bean id = "transactionManager"> <property name = "dataSource"ref = "dataSource"/> </bean>
지정된 데이터 소스는 일반적으로 스프링을 사용하는 JDBC 데이터 소스 일 수 있습니다. 여기에는 연결 풀과 JNDI 조회를 통해 얻은 데이터 소스가 포함됩니다.
트랜잭션 관리자에 지정된 DataSource는 SQLSESSSIONFACTORYBEAN을 작성하는 데 사용 된 것과 동일한 데이터 소스 여야합니다. 그렇지 않으면 트랜잭션 관리자가 작동하지 않습니다.
2. 컨테이너 관리 거래
JEE 컨테이너를 사용하고 Spring이 컨테이너 관리 트랜잭션에 참여하려면 Spring을 JTATRANSACTIONMANAGER 또는 컨테이너 지정 서브 클래스를 사용하여 구성해야합니다. 이를 수행하는 가장 편리한 방법은 Spring의 트랜잭션 네임 스페이스를 사용하는 것입니다.
<TX : JTA-Transaction-Manager/>
이 구성에서 MyBatis는 컨테이너 관리 트랜잭션에 의해 구성된 다른 스프링 트랜잭션 리소스와 동일합니다. Spring은 기존 컨테이너 트랜잭션을 자동으로 사용하여 SQLSESSION을 첨부합니다. 거래가 시작되지 않았거나 거래가 필요한 경우 Spring을 사용하면 새로운 컨테이너가 거래를 관리 할 수 있습니다.
Spring의 트랜잭션 관리가 아닌 컨테이너를 사용하여 트랜잭션을 관리하려면 다른 스프링 트랜잭션 관리자 대신 기본 MyBatis ManageEdTransactionFactory를 사용하도록 SQLSESSIONFACTORYBEAN을 구성해야합니다.
<bean id = "sqlsessionfactory"> <property name = "dataSource"ref = "dataSource"/<property name = "transactionFactoryClass"> <tallactOctoryClass "> value> org.apache.ibatis.transaction.managedTransactionActory"/> </property> </bean>
3. 프로그래밍 거래 관리
Mybatis의 SQLSession은 프로그래밍 방식 트랜잭션을 처리하는 지정된 방법을 제공합니다. 그러나 mybatis-spring을 사용할 때는 콩이 스프링 관리 SQLSESSION 또는 MAPPER를 사용하여 주입됩니다. 즉, 봄은 일반적으로 거래를 처리한다는 것을 의미합니다. 스프링 관리 sqlsession에서 sqlsession.commit (), sqlsession.rollback () 또는 sqlsession.close () 메소드를 호출 할 수 없습니다. 이렇게하면 지원되지 않은 지출이 발생합니다. 주입 된 매퍼를 사용할 때 이러한 방법에 액세스 할 수 없습니다. 연결이 자동 커밋으로 설정되어 있는지 여부에 관계없이 SQLSESSION 데이터 방법의 실행 또는 스프링 트랜잭션 이외의 Mapper 메소드에 대한 호출이 자동으로 커밋됩니다. 다음은 프로그래밍 거래의 예입니다.
defaultTransactionDefinition def = new defaultTransactionDefinition (); def.setPropagationBehavior (transactionDefinition.Propagation_Required); TransactionStatus status = txmanager.getTransaction (def); try {usermapper.insertuser (user); } catch (myException ex) {throw ex; } txmanager.commit (상태);4.@트랜잭션 방법 :
클래스 경로 아래에서 beans-da-tx.xml 파일을 만들고 beans-da.xml (시리즈 V)를 기반으로 트랜잭션 구성을 추가하십시오.
<!-트랜잭션 관리자-> <bean id = "txmanager"> <property name = "dataSource"ref = "dataSource" /> < /bean> <!-트랜잭션 주석 드라이버, 클래스 및 메소드 @transactional은 트랜잭션이 될 것입니다-> <tx : annotation-driven transaction-manager = "txmanager" />>> userservice " />
서비스 카테고리 :
@Service ( "userService") public class userservice {@autowired iusermapper mapper; public int batchupdateuserswhenexception () {// 비 트랜잭션 사용자 = 새 사용자 (9, "예외"); int inffectedCount = mapper.updateUser (사용자); // 실행 성공적인 사용자 user2 = 새 사용자 (10, "예외 후"); int i = 1 / 0; // 런타임 예외 int inffectedCount2 = mapper.updateuser (user2); // if (expectedCount == 1 && inffectedCount2 == 1) {return 1; } 반환 0; } @transactional public int txupdateuserswhenexception () {// 트랜잭션 사용자 = 새 사용자 (9, "예외 전"); int inffectedCount = mapper.updateUser (사용자); // 후속 예외로 인한 롤백 사용자 user2 = 새 사용자 (10, "예외 후"); int i = 1 / 0; // 런타임 예외를 던지고 트랜잭션 롤백 int infectectedCount2 = mappper.updateuser (user2); // if (expectedCount == 1 && inffectedCount2 == 1) {return 1; } 반환 0; }}테스트 클래스에서 :
@RunWith (SpringJunit4classRunner.class) @ContextConfiguration (위치 = { "ClassPath : Beans-da-tx.xml"}) public class springIntegratextest {@Resource UserserVice UserserVice; @Test public void updateUsersExceptionTest () {userErvice.batchUpDateUserswhenexception (); } @test public void txupdateUsersExceptionTest () {userErvice.txupDateUserswhenexception (); }}
5. TransactionTemplate 방법
beans-da-tx.xml에 추가하십시오 :
<bean id = "txtemplate"> <생성자-아그 유형 = "org.springframework.transaction.platformtransactionManager"ref = "transactionManager" /< /bean>
Userservice 클래스에 가입 :
@autowired (필수 = false) transactiontemplate txtemplate; public int txupdateuserswhenexceptionviatextemplate () {int retval = txtemplate.execute (new TransactionCallback <integer> () {@override public integer dointransaction (transactionStatus status) {// transaction operation user user = new user (9, "Exception" 후속 사용자 2 = "예외 후"int i = 1 // int infectedcount2 = upper2. return returnval; }SpringIntegrateTextest 클래스에 추가하십시오.
@Test public void updateUserswheneceptionViatxTemplateStest () {userErvice.txUpDateUserswhenexceptionViatxTemplate (); //}참고 : 던지지 않고 예외 또는 runtimeexception을 포착 할 수 없습니다.
@transactional public int txupdateuserswhenexceptionandcatch () {// 트랜잭션 작업, 그러나 주변 장치 프레임 워크는 예외를 포착하여 실행이 올바른 경우 제출할 수 없습니다. {user user = new user (9, "예외 전")를 시도하십시오. int inffectedCount = mapper.updateUser (사용자); // 실행은 성공적인 사용자 user2 = 새 사용자 (10, "예외 후"); int i = 1 / 0; // 런타임 예외 int inffectedCount2 = mapper.updateuser (user2); // if (expectedCount == 1 && inffectedCount2 == 1) {return 1; }} catch (예외 e) {// 모든 예외는 e.printstacktrace ()를 던지지 않고 잡혔습니다. } 반환 0; }