Sử dụng Database Transaction trong WordPress

Database Transaction là một tổ hợp hỗ trợ truy vấn các thao tác với dữ liệu cần đảm bảo tính nhất quán, ràng buộc trên database: CREATE, INSERT, DELETE, UPDATE,… Để sử dụng database transaction trong WordPress rất đơn giản bạn dùng kết hợp với query() theo nội dung chia sẻ ngay sau đây.

Sử dụng Class

Việc sử dụng class sẽ hỗ trợ bạn dễ dàng phát triển các tính năng, quản lý lỗi cũng như tái sử dụng khi phát triển plugins, themes với database transaction. Đầu tiên khai báo class myClassDatabaseTransaction. Các phương thức khai báo như sau:

<?php
class myClassDatabaseTransaction{
    private $wpdb;
    private $error;
    
    public function __construct() {
        global $wpdb;
        $this->wpdb = $wpdb;
    }
    
    public function start_transaction() {
        $this->wpdb->query('START TRANSACTION');
    }
    
    public function update_data( $data, $where ) {
        $this->wpdb->update( $this->wpdb->prefix . 'table_name', $data, $where );
        $this->error = $this->wpdb->last_error;
    }
    
    public function insert_data( $data ) {
        $this->wpdb->insert( $this->wpdb->prefix . 'table_name', $data );
        $this->error = $this->wpdb->last_error;
    }
    
    public function commit() {
        if( ! $this->error ) {
            $this->wpdb->query('COMMIT');
        } else {
            $this->wpdb->query('ROLLBACK');
        }
    }
}
?>

Sử dụng các phương thức của lớp myClassDatabaseTransaction để thực thi các thao tác trên database. Trong quá trình xử lý insert, update hay các thao tác lên cơ sử dữ liệu nếu tất cả câu lệnh trước commit() thành công thì toàn bộ sẽ được commit lưu về cơ sở dữ liệu và ngược lại bất cứ thao tác nào phát sinh lỗi toàn bộ các thao tác khi bắt đầu start_transaction() sẽ được khôi phục.

<?php
$transaction = new myClassDatabaseTransaction();
$transaction->start_transaction();

$data = array(
    'column1' => 'value1',
    'column2' => 'value2'
);
$where = array( 'ID' => 1 );
$transaction->update_data( $data, $where );

$data = array(
    'column1' => 'value3',
    'column2' => 'value4'
);
$transaction->insert_data( $data );

$transaction->commit();
?>

Không sử dụng Class

Đối với các tính năng không cần tái sử dụng bạn hoàn toàn có thể dùng Database Transaction đơn giản như sau:

<?php
global $wpdb;
// Bắt đầu transaction
$wpdb->query('START TRANSACTION');

// Thực thi các truy vấn tác động lên dữ liệu ở đây là update và insert
$wpdb->update( $wpdb->prefix . 'table_name', array( 'column1' => 'value1', 'column2' => 'value2' ), array( 'ID' => 1 ) );
$wpdb->insert( $wpdb->prefix . 'table_name', array( 'column1' => 'value3', 'column2' => 'value4' ) );

// Nếu không có lỗi xảy ra, commit transaction
if( ! $wpdb->last_error ) {
    $wpdb->query('COMMIT');
} else {
    // Nếu có lỗi xảy ra, rollback transaction
    $wpdb->query('ROLLBACK');
}
?>

Database Transaction hỗ trợ bảo đảm các thông tin dữ liệu liên quan chặt chẽ với nhau và cần tính bảo toàn sự ràng buộc. Ví dụ các giao dịch có hình thức dạng chuyển tiền, trừ tiền, quy đổi hay các thao tác liên quan tới thanh toán ghi nhận đơn hàng,…