Transaction là gì? Code ví dụ transaction với JDBC

Hướng dẫn Java JDBC : Transaction là gì ? Code ví dụ transaction với JDBC
Chắc hẳn bạn đã nghe nhiều tới transaction trong lập trình, hệ quản lý … vậy transaction là gì ?

1. Transaction là gì?

Transaction là 1 thanh toán giao dịch ( hay còn gọi là 1 giao tác ) gồm có 1 loạt những hành vi được phải được triển khai thành công xuất sắc cùng nhau, nếu 1 hành vi thất bại thì tổng thể những hành vi trong loạt hành vi đó sẽ quay trở lại trạng thái bắt đầu .

Ví dụ bạn có 2 tài khoản ngân hàng A và B, bạn chuyển 1.000.000đ từ tài khoản A vào tài khoản B.

Transaction ở đây sẽ gồm 2 hành vi :

  • Tài khoản A bị trừ 1.000.000đ
  • Tài khoản B cộng thêm 1.000.000đ

Bây giờ A bị trừ một triệu đ nhưng vì 1 nguyên do nào đấy B bị lỗi không nhận được một triệu đ thì transaction sẽ bị hủy, số tiền của 2 thông tin tài khoản A và B sẽ không bị đổi khác .
Chính vì ràng buộc phải triển khai xong cùng nhau nên transaction được vận dụng nhiều trong những hành vi nhu yếu độ an toàn và đáng tin cậy, bảo vệ tính đúng mực tài liệu …

Hướng dẫn Java JDBC : Transaction là gì ? Code ví dụ transaction với JDBC

Nhược điểm của transaction

Đôi khi một số ít trường hợp do phần cứng, mạng internet mà transaction hoạt động giải trí không đúng và người ta phải ghi log lại để khắc phục điều đó .
Ví dụ :
Bạn ra cây ATM rút tiền, bạn gửi lệnh rút một triệu đ, thông tin tài khoản trong ngân hàng nhà nước bị trừ một triệu đ nhưng sau đấy mất mạng – > không hề xác lập được cây ATM đã trả tiền ra chưa, nên số tiền một triệu đ sẽ không được hoàn trả thông tin tài khoản .
Nếu bạn chưa nhận được một triệu đ thì sẽ cần thông tin với ngân hàng nhà nước, họ sẽ kiểm tra log trên server và log trên cây ATM để xác nhận và hoàn trả lại tiền cho bạn .

2. Ví dụ Transaction với JDBC

JDBC chịu nghĩa vụ và trách nhiệm tiếp xúc với database do đó nó sẽ thực thi tạo transaction khi truy vấn tài liệu tới database .
Mình sẽ triển khai code ví dụ trường hợp chuyển tiền giữa 2 thông tin tài khoản ngân hàng nhà nước .
Giả sử số tiền trong mỗi thông tin tài khoản chỉ được chứa số tiền nhỏ hon 100.000.000 đ, nếu 1 thông tin tài khoản được update số tiền > = 100.000.000 đ thì sẽ xảy ra lỗi .
Tài khoản A và thông tin tài khoản B đều có 90.000.000 đ, giờ đây ta triển khai chuyển 50.000.000 đ từ A sang B trong trường hợp có và không dùng transaction để xem hiệu quả :
Ở ví dụ này mình sử dụng :

  • MySQL làm cơ sở dữ liệu (Xem lại: Cài đặt và cấu hình MySQL)
  • Eclipse
  • Maven

Tạo cơ sở tài liệu : “ demo-jdbc-transaction ”

CREATE SCHEMA `demo-jdbc-transaction` ;

Tạo table “ account_banking ”

CREATE TABLE `demo-jdbc-transaction`.`account_banking` (
 `id` INT NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(45) NULL,
 `amount` DECIMAL(13,5) NULL,
 PRIMARY KEY (`id`),
 UNIQUE INDEX `name_UNIQUE` (`name` ASC));

  • cột amount mình để là DECIMAL(13,5) tức là số thực có 5 chữ số sau dấu phẩy và chữ 8 số trước dấu phẩy, nếu update amount >= 100.000.000,0 tức là lớn hơn 8 chữ số trước dấu phẩy nên sẽ xảy ra lỗi.
  • cột name mình để là unique tức là không trùng nhau, nếu trung sẽ xảy ra lỗi.

Tạo 2 bản ghi cho thông tin tài khoản A và B :

INSERT INTO `demo-jdbc-transaction`.`account_banking` (`name`, `amount`) VALUES ('A', 90000000.0);
INSERT INTO `demo-jdbc-transaction`.`account_banking` (`name`, `amount`) VALUES ('B', 90000000.0);

Hướng dẫn Java JDBC: Transaction là gì? Code ví dụ transaction với JDBC

Code ví dụ:

Hướng dẫn Java JDBC: Transaction là gì? Code ví dụ transaction với JDBC

Hướng dẫn Java JDBC : Transaction là gì ? Code ví dụ transaction với JDBC

Thực hiện chuyển 50.000.000đ từ A sang B mà có sử dụng transaction:

A bị trừ 50.000.000 đ còn B được cộng thêm 50.000.000 đ nên sẽ update amount của A thành 40.000.000 đ còn B là 140.000.000 đ

package stackjava.com.demojdbc.statement;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class UpdateWithTransaction {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.jdbc.Driver");
    Connection dbConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc-transaction", "root", "admin1234");
    Statement stmt = dbConnection.createStatement();
    
    dbConnection.setAutoCommit(false);
    
    try {
      stmt.executeUpdate("UPDATE account_banking SET amount = 40000000.0 WHERE name = 'A'");
      stmt.executeUpdate("UPDATE account_banking SET amount = 140000000.0 WHERE name = 'B'");
      dbConnection.commit();
    } catch (Exception e) {
      e.printStackTrace();
      dbConnection.rollback();
    }
    dbConnection.close();
  }
}

Giải thích :

  • dbConnection.setAutoCommit(false): dữ liệu sẽ chỉ update vào database khi gọi lệnh commit()
  • dbConnection.rollback(): lấy lại dữ liệu ban đầu.

Kết quả :

Hướng dẫn Java JDBC: Transaction là gì? Code ví dụ transaction với JDBC Hướng dẫn Java JDBC: Transaction là gì? Code ví dụ transaction với JDBC

Câu lệnh update thứ nhất thành công xuất sắc nhưng câu lệnh update thứ 2 xảy ra lỗi lên tài liệu sẽ không bị đổi khác

Thực hiện chuyển 50.000.000đ từ A sang B mà không sử dụng transaction:

package stackjava.com.demojdbc.statement;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class UpdateWithoutTransaction {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.jdbc.Driver");
    Connection dbConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc-transaction",
        "root", "admin1234");
    Statement stmt = dbConnection.createStatement();
    stmt.executeUpdate("UPDATE account_banking SET amount = 40000000.0 WHERE name = 'A'");
    stmt.executeUpdate("UPDATE account_banking SET amount = 140000000.0 WHERE name = 'B'");
    dbConnection.close();
  }
}

Kết quả :

Hướng dẫn Java JDBC: Transaction là gì? Code ví dụ transaction với JDBC

Sau khi câu lệnh thứ nhất thành công xuất sắc nó sẽ update tài liệu vào database luôn
Câu lệnh thứ hai xảy ra lỗi nhưng không hồi sinh lại tài liệu đã đổi khác trước đó .

Trên đây là ví dụ đơn thuần nhất về transaction, những bạn hoàn toàn có thể thử với trường hợp khác .
Ví dụ cột name mình đang để là unique – > những bạn sử dụng transaction, triển khai câu lệnh insert mới account với name là C, D, A nó sẽ xảy ra lỗi và không insert gì cả vì A đã sống sót sẵn trong database .

Hướng dẫn Java JDBC : Transaction là gì ? Code ví dụ transaction với JDBC

Okay, Done!

Download code ví dụ trên tại đây

References : https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html