Database Transaction được gọi là tổ hợp các truy vấn thao tác trên database gồm những lệnh thông thường như CREATE, INSERT, DELETE, UPDATE và nhiều loại truy vấn khác. Khi bạn sử dụng transaction trong quá trình thao tác nó sẽ đảm bảo việc tất cả truy vấn của bạn thao tác trên database. Có nghĩa là khi bạn thực hiện 2 hoặc nhiều truy vấn trở lên thì trong quá trình xử lý bắt buộc các truy vấn này phải thành công và không sảy ra lỗi thì mọi công việc bạn tương tác với database sẽ diễn ra thành công, nhưng nếu trường hợp khi nó chạy xong truy vấn thứ 1, khi đến truy vấn thứ 2 gặp lỗi thì lặp tức nó sẽ rollback lại ngay thì lúc này truy vấn thứ 1 sẽ bị vô hiệu hoá.

Vây trường hợp nào bạn sẽ sử dụng transaction ?

Một ví dụ đơn giản về thông tin User Profile chẳng hạn, khi bạn thực hiện truy vấn insert vào database thì lúc này bạn sẽ có 2 bảng thông tin cho users, bảng thứ 1 sẽ lưu thông tin chính của user gồm những thông tin như first_name, last_name, email, password…, bảng thứ 2 sẽ lưu thông tin phụ của user gồm những thông tin như birthday, company, address, location… Thì lúc này chúng ta sẽ có hai truy vấn insert vào database và bạn muốn nó thực hiện chắc chắn rằng mọi thông tin của người dùng nhập vào có đầy đủ trong CSDL thì lúc này bạn phải sử dụng transaction để đảm bảo cho tất cả truy vấn của bạn sẽ thành công và một khi đã sử dụng thì chắc chắn rằng sẽ không có trường hợp một user chỉ có thông tin đăng nhập mà không có thông tin cá nhân và ngược lại :)

Lý thuyết nhiều vãi tít mà vẫn chưa thấy ví dụ cụ thể :D vậy bây giờ chúng ta sẽ bắt đầu.

Đầu tiên chúng ta sẽ khởi tạo class để sử dụng :)

<?php class izDatabaseTransaction {} ?>

Tiếp theo chúng ta sẽ thực hiện tạo một construct để sử dụng biến global $wpdb trong class, nếu bạn chưa biết về construct thì có thể vào đây

<?php
class izDatabaseTransaction {

    public $wpdb;

    function __construct()
    {
        global $wpdb;
        $this->wpdb = $wpdb;
    }
}
?>

Để sử dụng transaction chúng ta sẽ tạo ra 4 hàm:
1. beginTransaction ( Bắt đầu xử lý một transaction )
2. queryException ( Bắt lỗi query )
3. commit ( Khi mọi truy vấn thao tác thành công thì sẽ thực hiện commit lên database )
4. rollBack ( trong quá trình xử lý nếu gặp lỗi sẽ rollback lại từ đầu )

<?php
class izDatabaseTransaction {

    public $wpdb;

    function __construct()
    {
        global $wpdb;
        $this->wpdb = $wpdb;
    }

    public function beginTransaction()
    {
        return $this->wpdb->query("START TRANSACTION;");
    }

    public function queryException($error)
    {
        if(!empty($error)){
            throw new Exception("SQL ERRORS");
        }
    }

    public function commit()
    {
        return $this->wpdb->query("COMMIT;");
    }

    public function rollBack()
    {
        return $this->wpdb->query("ROLLBACK;");
    }
}
?>

Để sử dụng được transaction và bắt được lỗi query trong quá trình truy vấn thì bạn phải sử dụng try and catch trong php. Nếu bạn chưa biết có thể vào đây

<?php

    $db = new izDatabaseTransaction();
    $db->beginTransaction();
    try{

        $db->wpdb->insert('wp_users',[
            'user_login'=>'mr.nav90@gmail.com',
            'user_passs'=>'abcxyz',
            'user_nicename'=>'Mr Nav',
            'user_email'=>'mr.nav90@gmail.com',
            // .... more field
        ]);

        $db->wpdb->insert('wp_usermeta',[
            'user_id'=>1,
            'meta_key'=>'full_name',
            'meta_value'=>'Mr Nav'
        ]);

        $db->queryException(mysql_error());
        $db->commit();

    }catch(Exception $e){

        $db->rollBack();

        echo "ERROR !!! -- ".$e->getMessage();

    }

?>

Khi các bạn follow đoạn code trên, bạn sẽ thấy điểm bắt đầu của một transaction và bẫy lỗi trong quá trình query tới database. Khi sử dụng bạn luôn luôn nhớ một điều rằng phải “beginTransaction” trước cả “try and catch” và “queryException” chạy trước “commit”.

Có nghĩa là bạn sẽ thực hiện khởi tạo transaction trước mọi hành động rồi bắt đầu dùng try catch để bắt lỗi, trong quá trình query nằm trong đoạn “try” nếu có bất kỳ lỗi php sảy ra nó sẽ nhảy vào đoạn catch để hiện rollback lại quá trình xử lý và phun lỗi ra ngoài. Nếu tất cả query đều chạy thành công thì nó sẽ thực hiện commit query lên database.

Do vậy khi xử lý database nhiều thao tác bạn nên sử dụng transaction để các query của bạn đảm bảo thành công và không có sai sót.

Bài viết đến đây chắc cũng đủ nói lên những vấn đề bạn cần quan tâm rồi nhỉ, hẹn gặp lại ở toturial kế tiếp ;) Nếu có thắc mắc hoặc câu hỏi các bạn có thể comment dưới bài viết và mình sẽ cố gắng trả lời sớm nhất có thể.