[Diesel] 트랜잭션 걸기

[원본 링크]

트랜잭션은 Connection 객체의 transaction 메서드를 사용해서 걸 수 있다.
transaction 메서드는 하나의 함수를 받는데, 이 함수가 시작하기 전에 락을 걸고, 끝나면 푸는 원리다.

그리고 함수 안에서 뭔가 오류가 가면 rollback, 아무 문제없이 다 실행되면 commit을 한다.

그럼 대강 이런 식으로 사용할 수가 있다.
execute를 트랜잭션 클로저 안에서 하되, ? 표현식을 이용해 간략하게 오류를 처리하는 것이다.

query나 query2 둘중 하나만 오류가 발생해도 예외가 던져져 result가 Err로 오고, rollback이 될 것이다.

이 경우에는 두번째 쿼리가 PK 중복으로 오류를 던지기 때문에, 첫번째 쿼리도 완전히 적용되지 않는다.

그리고 아무 실패 없이 실행될 경우에는

당연히 잘 된다.

임의로 롤백을 시키고 싶다면 다음과 같이 직접 Err 객체를 반환하도록 하면 된다.

그렇다.


참조
https://users.rust-lang.org/t/actix-diesel-using-a-transaction/22108/9
https://docs.diesel.rs/diesel/connection/trait.Connection.html