
I. Giới thiệu
Chắc hẳn bạn đã nghe nhiều tới transaction trong lập trình, hệ điều hành… vậy transaction là gì và nó được ứng dụng trong các dự án thực tế ra sao. Sau đây, mình sẽ chia sẻ kỹ hơn với anh em khái niệm và demo một chương trình thực tế sử dụng Transaction.
II. Nội dung:
1. Transaction là gì
- Là một tập hợp các hành động cần thực hiện để một giao dịch hoàn thành. Một là tất cả các hành động đó được hoàn thành hoặc không có hành động nào được hoàn thành.
- Trong database: một hoặc nhiều câu lệnh SQL thực hiện nối tiếp nhau để hoàn thành một giao dịch
- Tất cả các lệnh đều được thực hiện – Commit
- Hoặc không có lệnh nào được thực hiện – Rollback

- Ví dụ:
- Về tài khoản ngân hàng. Tôi(A) muốn chuyển 100$ tới một tài khoản B
- Theo các bước sau: trừ 100$ tài khoản A và cộng 100$ vào tài khoản B
- Hệ thống lỗi, mất mạng, mất điện: A bị trừ 100$ và B không được cộng 100$. Số tiền đó có thể bị lạc trên vũ trụ
- Để giải quyết vấn đề trên, bước trừ tiền & cộng tiền ta nhóm vào một “transaction”
- Bước trừ tiền thành công, nhưng bước cộng tiền thất bại ta phải Rollback bước trừ tiền tài khoản A. Như vậy trạng thái tài khoản A trở về ban đầu
- Cả 2 bước đều thành công, ta thực hiện Commit > Giao dịch thành công
- Chú ý:
- Mặc định database connection là auto-commit set = true
- Ta cần tắt auto-commit: myConn.setAutoCommit(false);
- Dev có thể điều khiển được commit / rollback
- “myConn.commit();” hoặc “myConn.rollback();”
- Mặc định database connection là auto-commit set = true
- Code mô phỏng xử lý transaction

- Bước 1: ta set auto-commit là false

- Bước 2: ta thực hiện một transaction gồm một hoặc nhiều lệnh SQL(insert, update, delete)

- Bước 3: (tùy chọn) xác nhận với user để thực hiện giao dịch trên

- Bước 4: Nếu ok thực hiện lưu dữ liệu vào db, ko thì thực hiện rollback

2. Demo chương trình có sử dụng transaction
- Công nghệ & công cụ:
- Java SE 1.8
- Mariadb 10.2
- Mariadb java client 2.6.0
- SQL client: Dbeaver
- IDE: Intellij
- Source code: link github
- Ví dụ: thực hiện một Transaction
- B1: Delete all HR employees
- B2: Set salaries to $300,000 for all Engineering
Database
- Bảng employess

- Code demo tóm tắt:

- Kiểm tra trong database:
12-14: Tìm đến class driver của Mariadb trong Mariadb java client và tạo một kết nối tới database |
16: Setting auto-commit = false |
19-20: Thực hiện truy vấn lấy employees có department là HR / Enginering và hiện thị kết quả |
22-23: Thực hiện B1 |
26: Thực hiện B2 |
30: Helper method: hỏi user có muốn thực hiện Transaction đó hay không. Y > true / N > false |
31-39: User đồng ý, thực hiện giao dịch trên > Transaction COMMITTED Nếu không thực hiện rollback > Transaction ROLLED BACK |
41-43: In ra thông tin HR / Enginnering sau khi thực hiện các kết quả trên |
* Kết quả lần 1: Không lưu transaction Salaries BEFORE Show Salaries for Department: HR Doe | John | HR | 55000.00 Williams | David | HR | 120000.00 Adams | Carl | HR | 50000.00 Davis | John | HR | 45000.00 Show Salaries for Department: Engineering Public | Mary | Engineering | 75000.00 Johnson | Lisa | Engineering | 50000.00 Brown | Bill | Engineering | 50000.00 Fowler | Mary | Engineering | 65000.00 >> Transaction steps are ready. ** After execute DELETE & UPDATE Show Salaries for Department: HR Show Salaries for Department: Engineering Public | Mary | Engineering | 300000.00 Johnson | Lisa | Engineering | 300000.00 Brown | Bill | Engineering | 300000.00 Fowler | Mary | Engineering | 300000.00 Is it okay to save? Y/N: n —–>> Transaction ROLLED BACK. Salaries AFTER Show Salaries for Department: HR Doe | John | HR | 55000.00 Williams | David | HR | 120000.00 Adams | Carl | HR | 50000.00 Davis | John | HR | 45000.00 Show Salaries for Department: Engineering Public | Mary | Engineering | 75000.00 Johnson | Lisa | Engineering | 50000.00 Brown | Bill | Engineering | 50000.00 Fowler | Mary | Engineering | 65000.00 |

* Kết quả lần 2: Lưu transaction Salaries BEFORE Show Salaries for Department: HR Doe | John | HR | 55000.00 Williams | David | HR | 120000.00 Adams | Carl | HR | 50000.00 Davis | John | HR | 45000.00 Show Salaries for Department: Engineering Public | Mary | Engineering | 75000.00 Johnson | Lisa | Engineering | 50000.00 Brown | Bill | Engineering | 50000.00 Fowler | Mary | Engineering | 65000.00 >> Transaction steps are ready. ** After execute DELETE & UPDATE Show Salaries for Department: HR Show Salaries for Department: Engineering Public | Mary | Engineering | 300000.00 Johnson | Lisa | Engineering | 300000.00 Brown | Bill | Engineering | 300000.00 Fowler | Mary | Engineering | 300000.00 Is it okay to save? Y/N: y —–>> Transaction COMMITTED. Salaries AFTER Show Salaries for Department: HR Show Salaries for Department: Engineering Public | Mary | Engineering | 300000.00 Johnson | Lisa | Engineering | 300000.00 Brown | Bill | Engineering | 300000.00 Fowler | Mary | Engineering | 300000.00 |
- Lệnh DELETE department = ‘HR’ và UPDATE department = ‘Engineering’ được thực hiện và lưu kết quả vào một bảng tạm trên database trước khi những thay đổi đó được commit
- Khi không muốn save transaction, chọn n
- Những thay đổi triên đã ROLLED BACK về trạng thái ban đầu
- Kiểm tra trong database:

* Lệnh DELETE và UPDATE và có tác dụng tên bảng tạm trên database * Sau khi commit thì những thay đổi đó có tác dụng vào bảng employees |
- Tùy vào cơ chế và cấu mỗi database, khi thực hiện các lệnh UPDATE, DELETE, INSERT sẽ dược thực thi vào một hệ thống bảng tảm trước khi áp dụng vào bảng chính
- MariaDB mặc định commit mode là ON

- Ta có thể cài chỉnh được commit mode trực tiếp trên database hoặc trên SQL Client
III. Kết Luận:
- Ta hiểu thế nào là transaction
- Cách xử lý transaction sử dụng JDBC
- Hiểu cơ bản database cấu hình commit mode
Trần Mạnh Chung