Chuyển đến nôi dung chính

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng (tiếng Anh).

Khi bạn đăng ký với trang developerWorks lần đầu tiên, một tiểu sử của của bạn được tạo ra. Chọn các thông tin về tiểu sử của bạn (tên, nước/vùng, và nơi làm việc) đã được hiện lên màn hình, thông tin này sẽ được hiện kèm với nội dung mà bạn đăng tải. Bạn có thể cập nhật thông tin này bất kỳ lúc nào.

Thông tin gửi đi được đảm bảo an toàn.

  • Đóng [x]

Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng (tiếng Anh).

Thông tin gửi đi được đảm bảo an toàn.

  • Đóng [x]

DB2 9.7: Các giao dịch tự quản

Chúng là cái gì, cách tạo chúng thế nào và các ví dụ thực tế

Yash Manwani, Kỹ sư phần mềm, IBM  
Photo of Yash Manwani
Yash D. Manwani là một kỹ sư phần mềm hợp tác với IBM Ấn Độ. Anh đã làm việc cho IBM từ năm 2008. Từ khi gia nhập IBM, anh đã làm việc cùng với nhóm thử nghiệm kiểm tra chức năng ISL của DB2 và đã làm về bảo đảm chất lượng DB2 trong suốt khoảng thời gian này. Yash có bằng đại học kỹ thuật về Điện tử và Truyền thông của trường Đại học Khoa học và Công nghệ Cochin tại Ấn Độ.
Mike Springgay, Giám đốc phát triển cao cấp, IBM  
Photo of Mike Springgay
Mike Springgay là Giám đốc phát triển cao cấp trong nhóm phát triển DB2 cho Linux, UNIX và Windows. Ông gia nhập nhóm phát triển DB2 vào năm 1997 và hiện đang chịu trách nhiệm về các lĩnh vực kết nối máy chủ-máy khách và cơ sở hạ tầng thủ tục đã lưu.

Tóm tắt:  Tìm hiểu về các giao dịch tự quản, một tính năng đã được đưa vào trong Phiên bản 9.7 DB2® của IBM cho Linux®, UNIX® và Windows®. Bạn sẽ nhận được một tổng quan và ví dụ về giao dịch tự quản là gì và làm thế nào để tạo ra một giao dịch tự quản.

Xem thêm bài trong loạt bài này

Ngày:  20 09 2011
Mức độ:  Nhập môn Bản gốc tiếng Anh  tại đây
Hoạt động:  1536 lần đọc
Góp ý kiến:  


Mở đầu

Bài viết này giới thiệu các giao dịch tự quản, một tính năng đã được đưa vào trong DB2 9.7. Các giao dịch tự quản là một vấn đề đáng quan tâm cho cả các nhà quản trị cơ sở dữ liệu lẫn các nhà phát triển ứng dụng.

Bài viết này bàn về DB2 9.7 cho Linux, UNIX và Windows. Kiến thức về bộ xử lý dòng lệnh DB2 (CLP) và SQL PL rất có ích để hiểu bài này.

Để chạy các ví dụ, bạn cần truy cập vào một cơ sở dữ liệu DB2 9.7 cho Linux, UNIX và Windows. Xem Tài nguyên để tải về một bản dùng thử của DB2.


Tìm hiểu một chút nền tảng về các giao dịch

Các giao dịch là các thực thể thế giới thực có thể được biểu diễn dưới dạng văn bản chữ, số hoặc cả hai, để xử lý một hệ thống quản lý cơ sở dữ liệu. Chúng có ý nghĩa như là các hành động dựa vào cơ sở dữ liệu và chúng phải được thực hiện như một nhóm.

Ví dụ, một yêu cầu chuyển số tiền X từ tài khoản của người dùng A đến tài khoản của người dùng B là một giao dịch đơn giản. Có thể chia giao dịch này thành hai câu lệnh SQL, như trong Liệt kê 1.


Liệt kê 1. Ví dụ về giao dịch đơn giản

Update table AccountInfo set CurrentBalance = CurrentBalance - X, where UserName=A 
Update table AccountInfo set CurrentBalance = CurrentBalance + X, where UserName=B 
    

Giao dịch này chỉ có thể được coi là thành công nếu cả hai câu lệnh SQL có thể cập nhật bảng này thành công. Để chắc chắn rằng cả hai câu lệnh có hiệu lực hoặc chẳng có câu lệnh nào có hiệu lực, hãy chạy các ứng dụng theo cách sao cho không có thay đổi cơ sở dữ liệu nào được thực hiện cho đến khi một câu lệnh COMMIT (Cam kết) xảy ra. Khi gặp câu lệnh COMMIT, tất cả các câu lệnh còn chưa được cam kết (các câu lệnh sau COMMIT cuối cùng) đều có hiệu lực cùng một lúc, đảm bảo tính toàn vẹn dữ liệu. Điều này tương tự như việc TẮT (OFF) hành vi AUTO COMMIT của bộ xử lý dòng lệnh (CLP), rồi phát ra một tập các câu lệnh và sau đó tự tay đưa ra một COMMIT khi đã thực hiện xong. Một câu lệnh ROLLBACK (Hủy giao dịch) hủy bỏ tất cả thay đổi chưa được cam kết. Vì vậy, các câu lệnh COMMIT và ROLLBACK là các khối xây dựng quan trọng để triển khai thực hiện giao dịch.


Giới thiệu một giao dịch tự quản

Một giao dịch tự quản có phạm vi COMMIT và ROLLBACK riêng của mình để đảm bảo rằng kết quả của nó không ảnh hưởng đến những thay đổi chưa được cam kết của người gọi. Ngoài ra, các COMMIT và các ROLLBACK trong phiên đang gọi không ảnh hưởng đến các thay đổi đã được hoàn thành vào lúc kết thúc của chính giao dịch tự quản này.

Lưu ý rằng phiên đang gọi bị treo cho đến khi phiên được gọi trả về quyền điều khiển. Hỗ trợ cho các giao dịch tự quản hoàn toàn không nên được xem như là sự hỗ trợ để có các phiên thực hiện song song.


Tạo ra một giao dịch tự quản

Trong DB2, các giao dịch tự quản được triển khai thực hiện thông qua các thủ tục tự quản. Một thủ tục lưu sẵn cung cấp một phương tiện tự nhiên để bó các câu lệnh lại thành một khối. Để tạo một thủ tục tự quản, từ khoá AUTONOMOUS (Tự quản) được chỉ rõ trên câu lệnh CREATE PROCEDURE (Tạo thủ tục), như trong Liệt kê 2.


Liệt kê 2. Ví dụ về câu lệnh CREATE PROCEDURE
            
CREATE OR REPLACE your_procedure_name
LANGUAGE SQL
AUTONOMOUS
BEGIN    
	do autonomous work ;
END
    

Khi một thủ tục tự quản được gọi, nó được thực hiện bên trong phiên riêng của mình để tạo ra tính độc lập cần thiết của giao dịch. Các thủ tục tự quản thành công cam kết hoàn toàn, trong khi các thủ tục tự quản không thành công lại hủy giao dịch. Trong cả hai trường hợp, các giao dịch đang gọi không bị động chạm đến.


Xem một ví dụ sử dụng thực tế

Ngân hàng B muốn bảo đảm mỗi truy vấn đến một bảng chứa dữ liệu khách hàng nhạy cảm được ghi nhật ký đúng. Để đạt được mục tiêu này, người ta giao cho các nhà phát triển ứng dụng tại Ngân hàng B một tập các giao diện có thể dùng để truy cập dữ liệu nhạy cảm. Mỗi giao diện được triển khai thực hiện như một thủ tục đã lưu sẵn. Các thủ tục đã lưu trả về thông tin cần thiết từ bảng này, trong cùng lúc đó ghi lại mã định danh (ID) người dùng của nhân viên đang thực hiện truy vấn và số tài khoản của bản ghi khách hàng đang được truy vấn kèm theo ngày tháng và thời gian.

Các giả định

SQL giả định tất cả như sau:

  • Đã có một kết nối cơ sở dữ liệu.
  • Tắt cam kết tự động.
  • Ký tự kết thúc câu lệnh được thiết lập là %, bằng cách nhập vào câu lệnh CLP của DB2 là db2 +c -td% khi bắt đầu một phiên CLP mới của DB2.

Bắt đầu

Trước tiên tạo ra các bảng cần thiết. Bạn sẽ cần một bảng để giữ thông tin khách hàng nhạy cảm và một bảng khác để giữ thông tin được ghi nhật ký mỗi lần truy cập thông tin nhạy cảm. Liệt kê 3 cho thấy một ví dụ.


Liệt kê 3. Tạo hai bảng ví dụ
            
DROP TABLE customerSensitiveInfo %
CREATE TABLE customerSensitiveInfo(customerAccountNumber integer, amountOverdue integer) %

DROP TABLE log_table %
CREATE TABLE
   log_table(queryingEmployeeID varchar(100), 
             customerAccNumber integer, when timestamp) %
COMMIT %
    

Tiếp theo, tạo một thủ tục để viết vào log_table khi truy cập thông tin nhạy cảm, như trong Liệt kê 4.


Liệt kê 4. Viết vào bảng log
            
CREATE OR REPLACE PROCEDURE
   log_query (in queryingEmployee varchar(100), 
              in accNumber integer, in when timestamp)
LANGUAGE SQL
BEGIN
   insert into log_table values (queryingEmployee, accNumber, when);
END %
COMMIT %
    

Một trong những giao diện mà Ngân hàng B cung cấp cho các nhà phát triển ứng dụng của mình là một phương tiện để truy vấn xem một tài khoản cụ thể đã nợ quá hạn bao nhiêu. Đầu tiên thủ tục get_AmountOverdue thực hiện cuộc gọi đến thủ tục log_query để ghi lại rằng nó sẽ truy cập dữ liệu nhạy cảm. Rồi nó thực hiện một select từ bảng customerSensitiveInfo để lấy ra số tiền nợ quá hạn của số tài khoản cụ thể. Liệt kê 5 cho thấy một ví dụ.


Liệt kê 5. Thủ tục get_AmountOverdue
            
CREATE OR REPLACE PROCEDURE
   get_AmountOverdue(in accountNumber integer, out overdue integer)
LANGUAGE SQL
BEGIN
   DECLARE due integer;	
   DECLARE currentTime timestamp;
	
   SET currentTime= CURRENT TIMESTAMP;
	
   CALL log_query(CURRENT USER, accountNumber, currentTime );
	
   SELECT amountOverdue INTO due FROM customerSensitiveInfo 
                         WHERE customerAccountNumber= accountNumber;
									  	 
   SET overdue=due;
END %

COMMIT %
     

Sau khi bạn tạo giao diện get_AmountOverdue, hãy thêm một vài dữ liệu khách hàng vào bảng customerSensitiveInfo. Tiếp theo, thực hiện câu lệnh trong Liệt kê 6 để tạo bảng này.


Liệt kê 6. Câu lệnh để tạo ra bảng ví dụ
            
INSERT INTO customerSensitiveInfo VALUES(12345, 10000),(12346,20000) %
COMMIT %
     

Bảng kết quả có chứa các thông tin như trong Bảng 1.


Bảng 1. CustomerSensitiveInfo
Số tài khoản của khách hàngSố tiền nợ quá hạn
1234510,000
1234620,000

Bây giờ với bảng này đã điền dữ liệu và một phương tiện để truy cập vào nó, hãy lấy số tiền nợ quá hạn từ tài khoản 12345. Vì bạn chỉ quan tâm xem dữ liệu, nên bạn muốn làm như vậy một cách ẩn danh, hãy đưa ra câu lệnh rollback ngay sau cuộc gọi để che dấu vết tích của bạn, như trong Liệt kê 7.


Liệt kê 7. Thêm một câu lệnh rollback vào mã get_AmountOverdue
            
CALL get_AmountOverdue(12345, ?) %
        
Value of output parameters
--------------------------
Parameter Name  : OVERDUE
Parameter Value : 10,000
        
return Status = 0
        
ROLLBACK %
    

Kiểm tra trạng thái của log_table, nó trông giống như Liệt kê 8.


Liệt kê 8. log_table
            
SELECT * FROM log_table %
        
QUERYINGEMPLOYEEID     CUSTOMERACCNUMBER       WHEN
        
0 record(s) selected.
    

Theo dự kiến, bảng log là rỗng vì giao dịch có chứa cả hai câu lệnh truy cập thực tế vào bảng này và câu lệnh chèn vào bảng log đã hủy giao dịch. Đây chắc chắn không phải là hành vi mong muốn. Hãy thêm từ khóa AUTONOMOUS vào thủ tục log_query, như trong Liệt kê 9.


Liệt kê 9. Thủ tục log_query với câu lệnh AUTONOMOUS
            
CREATE OR REPLACE PROCEDURE 
   log_query (in queryingEmployee varchar(100), 
              in accNumber integer, in when timestamp)
LANGUAGE SQL
AUTONOMOUS
BEGIN
   INSERT INTO log_table values (queryingEmployee, accNumber, when);
END %

COMMIT %
    

Bây giờ lấy ra số tiền nợ quá hạn hạn từ tài khoản 12345 và hủy giao dịch này sau khi làm như vậy một lần nữa, như trong Liệt kê 10.


Liệt kê 10. Mã get_AmountOverdue với câu lệnh rollback
            
CALL get_AmountOverdue(12345, ?) %
        
Value of output parameters
--------------------------
Parameter Name  : OVERDUE
Parameter Value : 10,000
        
return Status = 0
        
ROLLBACK %
    

Một lần nữa, hãy kiểm tra trạng thái của log_table, nó bây giờ trông giống như Liệt kê 11.


Liệt kê 11. log_table sau khi thêm câu lệnh AUTONOMOUS
            
SELECT * FROM log_table %
			 	
QUERYINGEMPLOYEEID     CUSTOMERACCNUMBER       WHEN
98765                  12345                   2009:05:25:12.00.00.000000
			 	
1 record(s) selected.
    

Lúc này, có được kết quả mong muốn. Mặc dù giao dịch đọc những thông tin nhạy cảm đã tự hủy giao dịch, các mục nhập vào log_table được cam kết. Bằng cách này, bạn có thể duy trì lịch sử của những người đã truy cập vào dữ liệu đó, ngay cả khi bản thân việc truy cập đã không được cam kết.


Kết luận

Bài viết này đã giới thiệu khái niệm về các giao dịch tự quản. Bây giờ bạn sẽ hiểu một giao dịch tự quản là gì cũng như cách tạo và sử dụng một giao dịch tự quản trong DB2.


Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Đôi nét về các tác giả

Photo of Yash Manwani

Yash D. Manwani là một kỹ sư phần mềm hợp tác với IBM Ấn Độ. Anh đã làm việc cho IBM từ năm 2008. Từ khi gia nhập IBM, anh đã làm việc cùng với nhóm thử nghiệm kiểm tra chức năng ISL của DB2 và đã làm về bảo đảm chất lượng DB2 trong suốt khoảng thời gian này. Yash có bằng đại học kỹ thuật về Điện tử và Truyền thông của trường Đại học Khoa học và Công nghệ Cochin tại Ấn Độ.

Photo of Mike Springgay

Mike Springgay là Giám đốc phát triển cao cấp trong nhóm phát triển DB2 cho Linux, UNIX và Windows. Ông gia nhập nhóm phát triển DB2 vào năm 1997 và hiện đang chịu trách nhiệm về các lĩnh vực kết nối máy chủ-máy khách và cơ sở hạ tầng thủ tục đã lưu.

Hướng dẫn về "Phản ánh nội dung không thích hợp

Phản ánh về nội dung không thích hợp

Cám ơn. Nhận xét này sẽ được báo cho người chủ mục tin.


Hướng dẫn về "Phản ánh nội dung không thích hợp

Phản ánh về nội dung không thích hợp

Gửi phản ánh bị lỗi. Làm ơn thử lại sau.


developerWorks: Đăng nhập


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng (tiếng Anh).

 


Khi bạn đăng nhập lần đầu tiên, một bản trích ngang trên developerWorks sẽ được tạo ra. Chọn các thông tin trong trích ngang của developerWorks để hiển thị công khai, bạn có thể sửa lại thông tin này bất cứ lúc nào. Tên, họ và tên hiển thị sẽ đi kèm với nội dung mà bạn gửi lên.

Choose your display name

Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

(Độ dài phải từ 3 đến 31 ký tự)


Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng (tiếng Anh).

 


Chấm điểm bài này

Bình luận

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management
ArticleID=758550
ArticleTitle=DB2 9.7: Các giao dịch tự quản
publish-date=09202011
author1-email=yashaswee.yash@in.ibm.com
author1-email-cc=
author2-email=springga@ca.ibm.com
author2-email-cc=