자 이제 트랜잭션에 대해 알아봤으니, 트랜잭션을 사용해 보겠다
다시 복습 차원에서, 트랜잭션을 사용하기 위해서는 connection이 필요하다. connection를 만들어서 connection pool에 넣어주고 사용할 때 마다 connection pool에서 connection를 가져와서 사용한다. connection를 통해 db에게 sql문을 전달하기 때문이다.
트랜잭션은 autocommit이 false인 시점에서 부터 트랜잭션이 시작된다고 봐야되고, commit를 하기 전에는 update를 하는 해당 세션에만 데이터가 보여진다.
commit를 하면 db세션 관계없이 commit한 데이터가 모두에게 보여지게되며, rollback을 할 시 데이터는 보여지지 않게 된다.
또한, db 락을 통해 락을 획득한 세션만 update를 할 수 있으며 락을 반환하면 반환된 row의 데이터는 다른 세션이 update할 수 있다.
그럼 트랜잭션은 어느 로직에다가 적용되야 되는걸까?
바로 서비스 로직이다. 그럼 트랜잭션을 사용해보겠다.
dataSource에서 connection를 가지고 온다.
그리고 autocommit는 false로 설정해서 트랜잭션을 시작한다.
비지니스 로직에서 아이템의 가격을 -1000 수정해준다. 성공시 트랜잭션 commit를 해주고 실패시
rollback를 통해 데이터를 다시 되돌려 놓는다.
connecion를 파라미터로 주는 이유는 같은 connection를 사용되어야 되기 때문이다. 같은 connection를 사용하고 connection를 닫아주므로써 반환한다.
트랜잭션을 사용하기 위해서 이런 로직들을 만들어줘야된다.
하지만, 비지니스에서 트랜잭션을 설정해주는 로직이 중복되고 또한 비니지스 로직보다 길다. 그리고 JDBC에 서비스 계층이 의존되고 있다.
SQLException 또한 jdbc전용 기술이기 때문에 나중에 다른 데이터 접근 기술을 사용할 때 트랜잭션 코드들 또한 모두 수정해야된다