- vừa được xem lúc

Spring Boot Transactional - Lỗi hầu hết mọi người gặp phải

0 0 186

Người đăng: ledangtuanbk

Theo Viblo Asia

1. Giới thiệu vấn đề

Transaction đã được hỗ trợ trong Spring Boot Framework. Chỉ cần khai báo @Transactional trước method là xong như thế này. Theo như logic, khi có Exception xảy ra thì Transaction sẽ rollback lại các thao tác trước đó.

 @GetMapping("/get") @Transactional public void get() throws Exception { TestEntity testEntity = new TestEntity(); testRepository.save(testEntity); throw new Exception("test"); }

Như trong ví dụ trên, sẽ không lưu 1 bản ghi nào vào databases, nhưng thực tế data vẫn được lưu -> Vấn đề ở chỗ nào? Framework hoạt động sai?

2. Cách giải quyết vấn đề

Để giải quyết vấn đề này, ta đi đọc lại định nghĩa của @Transactional Trong khái niêm có đoạn

If no custom rollback rules apply, the transaction will roll back on RuntimeException and Error but not on checked exceptions

Nếu chúng ta không khai báo rollback rules thì transaction sẽ chỉ rool back khi có exception của RuntimeExceptionError. Còn các loại Checked Exceptions sẽ không được rollback

Có nhiều bạn không rõ về Checked vs Unchecked Exception xem ở đây

Có 2 cách cách giải quyết như sau:

2.1. Khai báo rollback rules

Có thể chọn 1 hay nhiều rules. Có thể dùng

 @GetMapping("/get2") @Transactional(rollbackFor = {Exception.class, Throwable.class}) public void get2() throws Exception { TestEntity testEntity = new TestEntity(); testRepository.save(testEntity); throw new Exception("test"); } 

2.2. Khi tạo lỗi, throw RunTimeExceptions hoặc Error

 @GetMapping("/get3") @Transactional public void get3() throws Exception { TestEntity testEntity = new TestEntity(); testRepository.save(testEntity); throw new Error("test");
// throw new RuntimeException("test"); }

MÌnh thì thích làm theo cách 1. Khai báo tường minh rollBackFor, giúp kiếm soát dễ hơn.

3. Kết Luận

Đây là 1 lỗi rất cơ bản, nhiều lúc các testcases không cover được đẫn đến bỏ sót lỗi. Kể cả các bạn lập trình viên vài năm kinh nghiệm mà vẫn gặp phải. Nếu cần trao đổi hãy comment ở bên dưới.

Link Sourcecode

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 302

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 278

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 50

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 194

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 71

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 139