Chủ Nhật, 19 tháng 9, 2021

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.

Mục lục

  • 1. Transaction trong Oracle là gì?
  • 2. SET TRANSACTION trong Oracle
  • 3. COMMIT Transaction trong Oracle
  • 4. ROLLBACK Transaction trong Oracle
  • 5. Lời kết

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.

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:

1
2
3
4
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.

READ ONLY
1
SET TRANSACTION READ ONLY NAME 'RO_example';

READ WRITE
1
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:

1
COMMIT [ COMMENT clause ];

Trong đó:

  • COMMENT là chú thích của lệnh COMMIT, dùng để giải thích.

Ví dụ
1
COMMIT COMMENT 'This is the comment for the transaction';

Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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ờ.

Cú pháp
1
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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é.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, oracle oca, oracle ocp, oracle ocm

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master