Tìm hiểu Transaction trong Oracle
Trong bài này chúng ta sẽ tìm hiểu một tính năng rất quan trọng trong các hệ quản trị CSDL, nó giúp hệ thống đảm bảo những truy vấn sẽ xử lý đồng thời vẩy ra đến cùng, nếu không thì sẽ trả lại trạng thái ban đầu. Để làm được điều đó thì bạn phải tìm hiểu đến Transaction, tức là xử lý giao dịch đồng thời.
1. Transaction trong Oracle là gì?
Transaction là một module dùng để xử lý những tập hợp truy vấn có liên quan đến nhau, và thường được dùng nhất là trong những giao dịch đòi hỏi phải có kết quả chính xác, đó chính là lý do tại sao người ta lấy tên là transaction (giao dịch).
Ví dụ khi bạn rút tiền tại cây ATM, bạn sẽ thực hiện các bước sau:
- Bước 1: Nhập mật khẩu
- Bước 2: Nhập số tiền, nhấn vào nút RÚT
- Bước 3: máy ATM sẽ trừ tiền
- Bước 4: Máy ATM trả tiền cho bạn
Giả sử tại bước 2 bạn nhấn RÚT và cây ATM mới chạy tới bước thứ 3, tức là trừ tiền trong tài khoản của bạn. Lúc này tự dưng điện bị mất, và bước 4 hoàn toàn không được thực hiện => Tài khoản của bạn bị trừ nhưng tiền không nhận được.
Bài viết này được đăng tại [free tuts .net]
Vậy giải pháp là sử dụng một module quản lý việc này, nếu trạng thái của bước 4 không thực hiện được thì hệ thống sẽ rollback lại, tức là mọi thao tác trươc sẽ được thiết lập lại trạng thái ban đầu.
Một ví dụ khác như sau: Giả sử bạn viết chương trình gửi hàng cho khách, bạn sẽ viết những câu truy vấn:
- Truy vấn 1: Lấy thông tin đơn hàng
- Truy vấn 2: Cập nhật đơn hàng sang trạng thái đã gửi hàng
Nhưng tại truy vấn 2 bị trục trặc và bạn không hề biết việc này, vậy là hàng đã gửi nhưng trong CSDL thì chưa, điều này rất nguy hiểm bởi có thể nhân viên khac sẽ gửi hàng thêm một lần nữa,
2. SET TRANSACTION trong Oracle
Trước tiên bạn xem cú pháp của transaction đã nhé.
Trong Oracle lệnh SET TRANSACTION dùng để tạo một transaction mới, cú pháp như sau:
SET TRANSACTION [ READ ONLY | READ WRITE ] [ ISOLATION LEVEL [ SERIALIZE | READ COMMITED ] [ USE ROLLBACK SEGMENT 'segment_name' ] [ NAME 'transaction_name' ];
Trong đó:
- READ ONLY là thiết lập chỉ đọc, còn READ WRITE là vừa đọc vừa có thể thay đổi dữ liệu ở transaction này.
- ISOLATION LEVEL sẽ có hai mức độ.
- ISOLATION LEVEL SERIALIZE nếu transaction này cố gắng thực hiện thay đổi mà trùng với transaction khác thì transaction sẽ thất bại.
- ISOLATION LEVEL READ COMMITTED nếu transaction sử dụng row mà đang bị row locks ở transaction khác thì sẽ chờ cho đến khi trạng thái row locks đó được giải phóng.
- USE ROLLBACK SEGMENT, không bắt buộc, nó sẽ gán transaction vào một rollback segment có tên là "segment_name" được đặt trong dấu ngoặc kép.
- NAME là tên của transaction bạn muốn đặt.
SET TRANSACTION READ ONLY NAME 'RO_example';
SET TRANSACTION READ WRITE NAME 'RW_example';
3. COMMIT Transaction trong Oracle
Lệnh COMMIT dùng để đẩy tất cả những cập nhật hệ thống, tức là những cập nhật đó sẽ được thay đổi trong CSDL và những transaction hoặc người dùng khác có thể nhìn thấy sự thay đổi đó. Lệnh này thường dùng tại vị trí mà bạn thấy đã an toàn trong một transaction.
Cú pháp:
COMMIT [ COMMENT clause ];
Trong đó:
- COMMENT là chú thích của lệnh COMMIT, dùng để giải thích.
COMMIT COMMENT 'This is the comment for the transaction';
DECLARE daily_order_total NUMBER(12,2); weekly_order_total NUMBER(12,2); monthly_order_total NUMBER(12,2); BEGIN COMMIT; -- ends previous transaction SET TRANSACTION READ ONLY NAME 'Calculate Order Totals'; SELECT SUM (order_total) INTO daily_order_total FROM orders WHERE order_date = SYSDATE; SELECT SUM (order_total) INTO weekly_order_total FROM orders WHERE order_date = SYSDATE - 7; SELECT SUM (order_total) INTO monthly_order_total FROM orders WHERE order_date = SYSDATE - 30; COMMIT; -- ends read-only transaction END;
4. ROLLBACK Transaction trong Oracle
Lệnh ROLLBACK dùng để hoàn trả lại trạng thái ban đầu cho transaction hiện tại hoặc những transaction mà bạn cảm thấy nghi ngờ.
ROLLBACK ;
Ví dụ: Thực hiện một vài thay đổi trong database và ROLLBACK nến có 1 lệnh bị lỗi.
CREATE TABLE emp_name AS SELECT employee_id, last_name FROM employees; CREATE UNIQUE INDEX empname_ix ON emp_name (employee_id); CREATE TABLE emp_sal AS SELECT employee_id, salary FROM employees; CREATE UNIQUE INDEX empsal_ix ON emp_sal (employee_id); CREATE TABLE emp_job AS SELECT employee_id, job_id FROM employees; CREATE UNIQUE INDEX empjobid_ix ON emp_job (employee_id); DECLARE emp_id NUMBER(6); emp_lastname VARCHAR2(25); emp_salary NUMBER(8,2); emp_jobid VARCHAR2(10); BEGIN SELECT employee_id, last_name, salary, job_id INTO emp_id, emp_lastname, emp_salary, emp_jobid FROM employees WHERE employee_id = 120; INSERT INTO emp_name VALUES (emp_id, emp_lastname); INSERT INTO emp_sal VALUES (emp_id, emp_salary); INSERT INTO emp_job VALUES (emp_id, emp_jobid); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('Inserts have been rolled back'); END;
5. Lời kết
Như vậy transaction rất hữu ích khi bạn quản trị hệ thống đòi hỏi có tính đồng bộ cao, nhất là những ứng dụng như phần mềm kế toán, kiểm toán, quản lý bán hàng ... Còn các ứng dụng website đơn giản thì ít khi sử dụng tới.
Thực tế bài này rất căn bản, nó chỉ đủ để bạn dùng ở trường hợp dễ nhất. Nếu bạn muốn tìm hiểu sâu hơn thì hãy lên trang tài liệu chính thức của Oracle nhé.