Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 7: Transaction SQL trong mysql module

Transaction  là một thứ có thể thiếu được trong các trang web có tích hợp cổng thanh toán hoặc ... Và đương nhiên là một thứ hay, quan trọng như thế thì sẽ không thể nào có thể thiếu được trong module mysql.

1, Transaction là gì?

-Transaction là một tiến trình xử lý các câu lệnh SQL, Transaction chỉ thành công khi tất cả các câu lệnh đều thành công, hoặc thất bại khi có 1 câu lệnh không thành công. 

-Transaction có 4 thuộc tính chuẩn và được mọi người gọi là ACID.

  • Atomicity (đơn vị) - đảm bảo rằng tất cả các câu lệnh bên trong transaction đều thành công, nếu không thì transaction sẽ dừng tại câu lệnh sai và các hoạt động (câu lệnh SQL) bên trong transaction được trả về trạng thái ban đầu.
  • Consistency (nhất quán) - đảm bảo rằng database sẽ được thay đổi chính xác theo như transaction đã đăng ký.
  • Isolation (độc lập) - đảm bảo rằng các transaction có khả năng hoạt động độc lập và không được liên quan đến nhau.
  • Durability (độ bền) - đảm bảo rằng database sẽ được thay đổi một cách chính thức khi transaction thành công.

VD: Khi chúng ta thực hiện insert 1 sản phẩm (product) thì cũng sẽ đồng thời insert gallery của sản phẩm đó. Nếu như chúng ta sử dụng transaction vào việc đó thì bất kỳ một trong hai câu lệnh trên, hoặc cả hai câu lệnh trên đều bị sai thì transaction sẽ dừng lại và quay trở về trạng thái ban đầu và ngược lại nếu như cả hai câu lệnh trên đều đúng thì transaction sẽ thành công.

- Các trạng thái bên trong transaction:

  • ROLLBACK - quay lại trạng thái ban đầu (trước khi thực thi transaction).
  • COMMIT - lưu các thay đổi của transaction.
  • SAVEPOIT - tạo ra các điểm neo để chúng ta có thể rollback về các điểm neo đó.
  • SET TRANSACTION - đặt tên cho transaction.

2, Transaction trong mysql module.

Lý Thuyết.

-Trong mysql module có hỗ trợ chúng ta 3 phương thức để tạo lên một transaction như sau:

  • beginTransaction(...) - bắt đầu 1 transaction.
  • rollback(...) - quay trở lại trạng thái ban đầu cho transaction.
  • commit(...) - lưu các thay đổi của 1 transaction.

-Chú ý: Để thực hiện được transaction thì database của bạn phải hỗ trợ transaction (xem các store engine trong mysql).

Ví dụ.

VD: Mình sẽ thực hiện một transaction thực hiện trên ý tưởng của ví dụ ở phần 1.

-Database của mình sẽ có dạng như sau:

+product:

CREATE TABLE `product` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `price` int(11) NOT NULL,
  `status` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `product`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `product`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;

+gallery:

CREATE TABLE `gallery` (
  `id` int(11) NOT NULL,
  `image_path` varchar(255) NOT NULL,
  `product_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `gallery`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `gallery`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

-Code thực thi transaction.

var mysql = require('mysql');

var conn = mysql.createConnection({
    host    : 'localhost',
    user    : 'root',
    password: '',
    database: 'mysql_node',
});
//kết nối.
conn.connect(function (err){
    if (err) throw err.stack;
    //Bắt đầu transaction
    conn.beginTransaction(function (err) {
        if(err) throw err;
        //Thực thi câu lệnh thứ 1
        conn.query("INSERT INTO product VALUES(null,'Áo Thun', '50000',1)",function (err,results) {
            //nếu có lỗi
            if (err) {
                //rollback quá trình
                return conn.rollback(function () {
                    throw err;
                });
            }
            //Nếu không lỗi, lấy ra id vừa insert
            var insertedID = results.insertId;
            //Thực thi câu lệnh thứ 2
            conn.query("INSERT INTO gallery VALUES(null,'home/uploads/logo.png',?)",insertedID,function (err) {
                //Nếu lỗi thì
                if (err) {
                    //rollback transaction
                    return conn.rollback(function () {
                        throw err;
                    });
                }
                //Nếu các câu truy vấn đều thành công thì thực hiện commit
                conn.commit(function (err) {
                    //nếu commit lỗi
                    if (err) {
                        //rollback transaction
                        return conn.rollback(function () {
                            throw err;
                        });
                    }
                    //Nếu thành công thì ...
                    console.log('insert thanh cong');
                });
            });
        });
    })
});

3, Lời kết.

-Transaction quả thật rất hữu dụng trong nhiều trường hợp, để sử dụng nó thì các bạn nên chú ý lựa chọn strore engine có hỗ trợ transcation.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

2 Comments

Callback hell trong truyền thuyết :)))

Khai

5 năm trước

hell thiệt :))

Bình luận

Captcha