/

13 tháng 7, 2013

Quản lý giao dịch Transaction

Chuyên mục này miêu tả mô hình Giao dịch (transaction), được sử dụng để thao tác trên các đối tượng AcDb. Trong mô hình này, nhiều thao tác trên nhiều đối tượng khác nhau được nhóm lại cùng với nhau trong một quá trình nguyên tử (atomic) gọi là một giao dịch (transaction).

Các giao dịch có thể được lồng và có thể kết thúc hay huỷ bỏ tuỳ theo quyết định của khách hàng (client). Mô hình này có thể được sử dụng kết hợp với cơ chế mở đóng trong từng đối tượng riêng lẻ như đã nói đến trong chuyên mục Đối tượng Cơ sở dữ liệu.



  • Tổng quan về quản lý giao dịch
  • Trình quản lý giao dịch
  • Các giao dịch lồng nhau
  • Giao dịch biên ngoài
  • Lấy con trỏ đến đối tượng trong một giao dịch
  • Đối tượng mới tạo và Giao dịch
  • Nguyên tắc thời gian hẹn trước (Commit-Time)
  • Undo và Giao dịch
  • Hoà trộn giữa mô hình giao dịch với cơ chế Mở và Đóng
  • Giao dịch và phát sinh đồ hoạ
  • Reactor giao dịch
  • Ví dụ về giao dịch lồng nhau
 

Tổng quan về quản lý giao dịch

 


Mô hình giao dịch đóng gói nhiều quá trình trên nhiều đối tượng bởi một số client (máy khách) thành một quá trình nguyên tử gọi là giao dịch. Bên trong ranh giới của một giao dịch, các client có thể mang các con trỏ từ ID của các đối tượng. Các con trỏ này sẽ hợp lệ cho đến khi giao dịch kết thúc, hoặc bị huỷ bỏ bởi client. Nếu giao dịch kết thúc thành công, các quá trình trên đối tượng sẽ được thực hiện theo đúng yêu cầu. Nếu huỷ bỏ giao dịch, các thao tác trên đối tượng cũng bị huỷ bỏ theo.

Quá trình trên các đối tượng sử dụng dạng thức (paradigm) này có một số lợi thế so với cơ chế mở và đóng đơn thuần đã nói đến trong chuyên mục Đối tượng Cơ sở dữ liệu. Cơ chế mở và đóng thích hợp hơn với các quá trình đơn giản trên một đối tượng riêng lẻ hoặc một nhóm đối tượng nhỏ. Tuy nhiên, sẽ có những hạn chế nhất định trong việc mở đối tượng theo cách này. Ví dụ, nếu đối tượng được mở để đọc, bạn không thể mở nó để Ghi tại cùng thời điểm. Nếu đối tượng được mở để ghi, bạn cũng không thể mở nó để ghi một lần nữa. Danh sách các lỗi xung đột của cơ chế mở và đóng, xem bài Đối tượng Cơ sở dữ liệu. Mô hình giao dịch khoan dung (lenient) hơn, có thể lấy được con trỏ đối tượng từ mã ID cho một phương thức đặc biệt thường thành công nếu như đối tượng có liên hệ với giao dịch.

Tuỳ thuộc vào ứng dụng của bạn, có thể sẽ gặp phải những khó khăn khác khi sử dụng cơ chế đóng mở. Nếu ứng dụng mở và đóng cùng một đối tượng một số lần nhất định chỉ trong một quá trình - ví dụ trong 1 lệnh - bạn sẽ gánh chịu (incur) sự thiếu hiệu quả nghiêm trọng do sử dụng đóng mở nhiều lần. Một số lượng các quá trình thời gian tiêu dùng (time-consuming) có liên kết với quá trình đóng đối tượng. Nếu bạn mở một đối tượng để Ghi, chỉnh sửa, và đóng đối tượng lại, thì bản ghi Undo của sự thay đổi được giao phó vào quá trình undo tệp tin, đồ hoạ đối tượng được phát sinh, và các thông báo được kích hoạt. Tất cả các quá trình được thực hiện mỗi lần đối tượng được đóng lại. Nếu bạn giao dịch hoá các quá trình và sử dụng con trỏ đối tượng sử dụng giao dịch, mọi hoạt động đề cập trước đó sẽ xảy ra một lần duy nhất khi kết thúc giao dịch. Kết quả được cải thiện hiệu quả đáng kể và một quá trình undo tệp tin nhỏ hơn, bởi vì số lượng các bản ghi undo giảm xuống.

Ngoài ra, nếu bạn có một mạng lưới phức tạp nơi các đối tượng tham chiếu đến các đối tượng khác bằng mã ID, bạn mỗ lấy con trỏ tới một đối tượng trong bất kỳ module nào của chương trình mà không phải lo lắng xem đã có module hay chương trình nào khác đã mở đối tượng hay chưa. Các hoạt động này chỉ có thể sử dụng mô hình giao dịch bởi vì giao dịch nhóm các quá trình và cho phép lấy con trỏ từ mã ID vượt qua cả ranh giới của một module.

Trình quản lý giao dịch


Trình quản lý giao dịch là một đối tượng quản lý toàn cục, giống như trình soạn thảo editor,  nó có trách nhiệm duy trì các giao dịch. Nó là một đại diện của AcTransactionManager và được duy trì trong hệ thống registry. Bạn có thể lấy được nó từ hệ thống registry bằng macro actrTransactionManager, có mở rộng là:

#define actrTransactionManager  \
AcTransactionManager::cast(
acrxSysRegistry()->at(AC_TRANSACTION_MANAGER_OBJ))

Trình quản lý giao dịch cần được dụng để mở đầu, kết thúc hoặc huỷ bỏ một giao dịch. Nó có thể cung cấp thông tin như số lượng các giao dịch hiện hành tại một thời điểm bất kỳ (xem thêm chuyên mục, Giao dịch lồng nhau) và một danh sách tất cả các đối tượng có con trỏ đang được sử dụng trong mọi giao dịch. Trình quản lý giao dịch duy trì một danh sách các reactor để nhắc nhở các máy trạm về sự kiện bắt đầu, kết thúc hay huỷ bỏ một giao dịch. 

Ngoài khả năng quản lý, trình quản lý giao dịch còn có thể được dùng để lấy con trỏ từ mã ID. Khi điều đó được thực hiện, đối tượng có liên hệ với giao dịch trên đỉnh (gần nhất). Trình quản lý giao dịch còn có thể được sử dụng để sắp xếp mọi đối tượng theo thứ tự trong tất cả giao dịch cho quá trình câp nhật đồ hoạ và dồn dịch sắp xếp (flush the queue).

Đối tượng trình quản lý giao dịch được tạo ra và quản lý bởi hệ thống. Bạn không nên xoá nó.

    Không có nhận xét nào:

    Đăng nhận xét