복붙노트

[SPRING] Spring의 JdbcTemplate과 트랜잭션

SPRING

Spring의 JdbcTemplate과 트랜잭션

JdbcTemplate을 사용할 때 트랜잭션을 명시 적으로 구성해야합니까?

내 코드 레이아웃은 다음과 같습니다.

내 UserService에 주입 될 UserDao를 갖게 될 것이고 내 Controllers는 내 UserService의 메소드에 대한 호출을 할 것입니다.

가능한 한 트랜잭션을 현명하게 유지하고 싶습니다. 트랜잭션을 확장하기 위해 여러 데이터베이스 호출이 필요하지 않습니다.

기본적으로 구성 파일에서 아무 것도하지 않거나 @Transaction 주석을 어디에서 사용해야합니까?

이제 내 컨트롤러에서 내 userService 및 accountService에 2 개의 호출을해야한다고 말하면 어떻게 든 트랜잭션에서 명시 적으로 래핑 할 수 있습니까?

userService.updateUser(user);
accountService.updateXXX(...);

해결법

  1. ==============================

    1.예, JdbcTemplate은 트랜잭션 관리를 대신 할 수 없습니다. 데이터베이스 트랜잭션의 이점은 여전히 ​​있으므로 userService.updateUser는 데이터베이스 트랜잭션에서 작동하지만 accountService.updateXXX가 실패하면 userService.updateUser가 롤백되지 않습니다.

    예, JdbcTemplate은 트랜잭션 관리를 대신 할 수 없습니다. 데이터베이스 트랜잭션의 이점은 여전히 ​​있으므로 userService.updateUser는 데이터베이스 트랜잭션에서 작동하지만 accountService.updateXXX가 실패하면 userService.updateUser가 롤백되지 않습니다.

    AOP를 사용하지 않으려면 대신 TransactionTemplate을 사용할 수 있습니다. Spring Reference Documentation에서 프로그래밍 방식의 트랜잭션 관리를 참조하십시오.

    이전에 보았던 한 가지 패턴은 MVC 컨트롤러 클래스가 작업을 캡슐화하는 비즈니스 서비스를 호출하는 것입니다. 그런 다음 비즈니스 클래스의 메소드에 @Transactional 주석을 달 수 있습니다.

  2. ==============================

    2.컨트롤러가 사용자와 계정으로 몇 가지 작업을 수행하고 모든 트랜잭션이 하나의 트랜잭션 내에서 발생하도록하려는 경우 모든 작업을 수행하는 하나의 메소드가있는 서비스가 있어야합니다. DAO 당 하나의 서비스를 생성하는 것은 좋은 생각이 아닙니다. 왜냐하면 DAO를 둘러싼 무언가 래퍼로 끝나고 데이터베이스가 DAO 호출마다 별도의 트랜잭션을 생성해야하기 때문에 처리 속도가 느릴 것이기 때문입니다. 그것이해야하는 것보다 훨씬 더 많은 일이 있습니다.

    컨트롤러가 사용자와 계정으로 몇 가지 작업을 수행하고 모든 트랜잭션이 하나의 트랜잭션 내에서 발생하도록하려는 경우 모든 작업을 수행하는 하나의 메소드가있는 서비스가 있어야합니다. DAO 당 하나의 서비스를 생성하는 것은 좋은 생각이 아닙니다. 왜냐하면 DAO를 둘러싼 무언가 래퍼로 끝나고 데이터베이스가 DAO 호출마다 별도의 트랜잭션을 생성해야하기 때문에 처리 속도가 느릴 것이기 때문입니다. 그것이해야하는 것보다 훨씬 더 많은 일이 있습니다.

    이 서비스는 컨트롤러 나 다른 사람에게 기능을 제공해야합니다. 서비스가 특정 유형의 사용자에게 유용한 특정 기능을 제공한다는 생각으로 서비스를 만들려고합니다.

  3. from https://stackoverflow.com/questions/12641666/springs-jdbctemplate-and-transactions by cc-by-sa and MIT license