hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 13: Kết nối MySQL, CRUD và transaction trong Service
Java và Spring Boot – MVC và REST API

Spring Boot bài 13: Kết nối MySQL, CRUD và transaction trong Service

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 6/12: JPA, MySQL và transaction · Bài 13/28 · Biên soạn tháng 10/2026.

← Bài 12 · Mục lục 12 chương · Bài 14 →

Mục lục

  • Mục tiêu bài học
  • Chuẩn bị một database dành riêng cho ví dụ
  • Biên transaction nằm ở nghiệp vụ
  • Rollback và lỗi không nên bị nuốt
  • Kiểm tra lưu bền và chẩn đoán kết nối
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Chuyển từ H2 sang MySQL, cấu hình tài khoản DB riêng và hiểu thời điểm commit hoặc rollback.

Chuẩn bị một database dành riêng cho ví dụ

Cài MySQL 8.4 LTS hoặc dùng máy chủ tương thích đã được bạn quản lý. Tạo database hvc_academy với utf8mb4 và tài khoản ứng dụng riêng; không chạy ứng dụng bằng tài khoản root. Tài khoản chạy migration của bài cần quyền tạo bảng trong đúng database mẫu. Hệ thống thực tế có thể tách tài khoản migration và tài khoản runtime với quyền hẹp hơn.

Đặt HVC_DB_URL theo dạng jdbc:mysql://localhost:3306/hvc_academy, HVC_DB_USER và HVC_DB_PASSWORD trong môi trường. Bật SPRING_PROFILES_ACTIVE=mysql, giữ HVC_DEMO_PASSWORD như lúc chạy H2. Nếu MySQL ở máy khác, cấu hình TLS và xác minh chứng chỉ phù hợp; không thêm tùy chọn tắt bảo mật chỉ để loại bỏ cảnh báo kết nối.

Tệp trong mã nguồn mẫu: src/main/resources/application-mysql.properties. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

spring.datasource.url=${HVC_DB_URL}
spring.datasource.username=${HVC_DB_USER}
spring.datasource.password=${HVC_DB_PASSWORD}
spring.jpa.hibernate.ddl-auto=validate

Biên transaction nằm ở nghiệp vụ

CourseService mặc định @Transactional(readOnly=true) cho thao tác đọc. Những phương thức create, update và delete ghi đè bằng @Transactional để cho phép ghi. Một lần gọi nghiệp vụ có thể cần nhiều repository; transaction giúp các bước dữ liệu hoàn tất cùng nhau hoặc rollback khi thất bại theo quy tắc của Spring.

Ví dụ update tìm Course, kiểm tra Category rồi đổi thuộc tính. Entity đang được quản lý trong transaction nên Hibernate phát hiện thay đổi và ghi khi flush/commit. Không cần gọi save lại chỉ để thông báo mỗi setter. Điều này khác với việc tạo một đối tượng mới hoặc sửa entity đã tách khỏi persistence context.

Tệp trong mã nguồn mẫu: src/main/java/com/hocvietcode/academy/CourseService.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

@Transactional
public CourseDto update(Long id,CourseForm form){
    Course c=courses.findById(id).orElseThrow(CourseNotFound::new);
    c.update(form.getTitle(),form.getPrice(),category(form)); return CourseDto.from(c);
}

Rollback và lỗi không nên bị nuốt

Theo mặc định, runtime exception và Error làm transaction rollback; checked exception cần chính sách rollback phù hợp nếu nghiệp vụ yêu cầu. Nếu bắt lỗi bên trong Service và im lặng trả thành công, interceptor có thể không còn thấy lỗi để rollback như bạn mong muốn. Thiết kế response thành công phải gắn với kết quả giao dịch thật.

@Transactional thường hoạt động qua proxy khi bean được gọi từ bên ngoài. Một phương thức tự gọi phương thức khác trên cùng instance không tự tạo một lần chặn proxy mới. Đừng dựa vào annotation rải rác để suy ra transaction đã hoạt động; hãy xác định điểm gọi vào bean và kiểm thử hành vi dữ liệu.

Kiểm tra lưu bền và chẩn đoán kết nối

Tạo một khóa học qua giao diện, dừng ứng dụng, chạy lại với cùng database và xác nhận bản ghi còn nguyên. So sánh với H2 giúp phân biệt lưu bền của database với vòng đời của tiến trình Java. Chỉ dùng database thử riêng khi chạy migration hoặc test có thao tác xóa.

Access denied thường liên quan tài khoản, mật khẩu hoặc host được phép; communications link failure thường liên quan máy chủ, cổng hoặc mạng. Schema validation báo kiểu cột không khớp là vấn đề schema khác với hai lỗi trên. Đọc nguyên nhân cụ thể trước khi thay driver hoặc thêm hàng loạt tham số JDBC không rõ tác dụng.

Lỗi thường gặp và lưu ý

  • readOnly=true là gợi ý tối ưu và ý định giao dịch, không phải cơ chế phân quyền người dùng.
  • Không đưa mật khẩu MySQL vào URL, bài viết công khai hoặc repository Git.

Ghi nhớ

Profile chọn database; Service xác định transaction; MySQL giữ dữ liệu sau khi ứng dụng dừng.

Tài liệu đối chiếu

  • Transaction management
  • MySQL 8.4 manual

← Bài 12 · Mục lục 12 chương · Bài 14 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 11: Post/Redirect/Get, flash message và session
Java và Spring Boot – MVC và REST API
Spring Boot bài 28: Đóng gói JAR, Docker và cấu hình triển khai
Java và Spring Boot – MVC và REST API
Spring Boot bài 12: JPA Entity, Repository, H2 và migration đầu tiên
Java và Spring Boot – MVC và REST API
Giáo trình Spring Boot MVC và REST API 2026: 12 chương, 28 bài
Java và Spring Boot – MVC và REST API
Spring Boot bài 14: Quan hệ JPA, DTO và tránh truy vấn N+1
Java và Spring Boot – MVC và REST API
Spring Boot bài 15: Tìm kiếm, phân trang và sắp xếp có kiểm soát
Java và Spring Boot – MVC và REST API
Spring Boot bài 16: Upload và download tài liệu có giới hạn
Java và Spring Boot – MVC và REST API
Spring Boot bài 17: Spring Security: đăng nhập, mật khẩu và SecurityFilterChain
Java và Spring Boot – MVC và REST API
Spring Boot bài 18: Phân quyền teacher/student và bảo vệ endpoint
Java và Spring Boot – MVC và REST API
Spring Boot bài 19: CSRF, CORS và gọi API có session đúng cách
Java và Spring Boot – MVC và REST API
Spring Boot bài 20: REST Controller, JSON và DTO cho API danh sách
Java và Spring Boot – MVC và REST API
Spring Boot bài 21: REST CRUD: POST, PUT, DELETE và mã trạng thái

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 05: Đơn vị và kích thước: px, rem, %, min và max

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 02: Selector và class: chọn đúng phần tử cần sửa

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 01: Kết nối CSS với HTML và sửa quy tắc đầu tiên

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 20: Hoàn thiện website và sửa lỗi bằng DevTools

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 03: Vì sao CSS không có tác dụng? Cascade và specificity

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×