1. Trang chủ
  2. » Công Nghệ Thông Tin

Các chiến lược giao tác: : Tổng quan về các mô hình và chiến lược Tìm hiểu về 3 mô hình giao tác và các chiến lược giao tác sử dụng những mô hình này pdf

19 432 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 220,87 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Với một loạt ví dụ dùng Spring Framework và đặc tả Enterprise JavaBeans 3.0 EJB, Mark Richards sẽ giải thích cách thức làm việc của các mô hình giao tác và cách thức chúng có thể tạo thà

Trang 1

Các chiến lược giao tác: : Tổng quan về các mô hình và chiến lược

Tìm hiểu về 3 mô hình giao tác và các chiến lược giao tác sử dụng những mô hình này

Mark Richards, Giám đốc và kiến trúc sư kỹ thuật cao cấp, Collaborative

Consulting, LLC

Tóm tắt: Một sai lầm thường gặp là nhầm lẫn giữa các mô hình giao tác với các

chiến lược giao tác Bài viết thứ hai này trong loạt bài Các chiến lược giao tác

phác họa những nét chính của ba mô hình giao tác, mà nền Java™ hỗ trợ và giới thiệu bốn chiến lược giao tác chính sử dụng các mô hình này Với một loạt ví dụ dùng Spring Framework và đặc tả Enterprise JavaBeans 3.0 (EJB), Mark Richards

sẽ giải thích cách thức làm việc của các mô hình giao tác và cách thức chúng có thể tạo thành nền tảng cho sự phát triển các chiến lược giao tác từ xử lý giao tác cơ bản đến hệ thống xử lý giao tác tốc độ cao

Rất thường xuyên, cả những người phát triển, nhà thiết kế và kiến trúc sư đều

nhầm lẫn các mô hình giao tác với các chiến lược giao tác Tôi hay hỏi kiến trúc

sư hay người lãnh đạo kỹ thuật trong cuộc gặp khách hàng là hãy mô tả về chiến lược giao tác của dự án họ đang tiến hành Tôi thường nhận được một trong ba kiểu trả lời Đôi lúc là sự im lặng “À, ừm, chúng tôi thật sự không sử dụng giao tác trong các ứng dụng của mình” Lúc khác thì là sự lúng túng “Ừm, tôi không chắc về điều anh định hỏi” Tuy nhiên, thường thì tôi nhận được câu trả lời vững tin rằng “Chúng tôi đang sử dụng giao tác dạng khai báo” (declarative

transactions) Nhưng như bạn sẽ thấy sau khi đọc bài viết này, thuật ngữ “giao tác

khai báo” chính là để mô tả một mô hình giao tác mà không hề có nghĩa là một chiến lược giao tác

Về loạt bài này

Các giao tác làm tăng chất lượng, tính toàn vẹn và tính nhất quán của dữ liệu của bạn, và khiến cho các trình ứng dụng của bạn vững chãi hơn Việc triển khai thể hiện thành công các xử lý giao tác trong các ứng dụng Java không phải là một bài tập bình thường, và đây là nói về việc thiết kế cũng quan trọng ngang với nói về viết mã lệnh Trong loạt bài mới này, Mark Richards sẽ hướng dẫn chúng ta thiết

kế một chiến lược giao tác hiệu quả cho một loạt các trường hợp từ các trình ứng dụng đơn giản cho đến xử lý giao tác hiệu năng cao

Ba mô hình giao tác được hỗ trợ trên nền Java là:

 Mô hình giao tác cục bộ

Trang 2

 Mô hình giao tác theo lập trình

 Mô hình giao tác khai báo

Các mô hình này mô tả những điều căn bản về việc các giao tác này sẽ hành xử như thế nào trên nền Java và chúng được triển khai thực hiện như thế nào Tuy nhiên, chúng chỉ đưa ra các quy tắc và ngữ nghĩa của xử lý giao tác Mô hình giao tác được áp dụng ra sao lại tùy thuộc hoàn toàn vào chúng ta Ví dụ, khi nào thì bạn nên dùng thuộc tính giao tác REQUIRED so với MANDATORY? Khi nào và

ở đâu bạn cần định rõ những chỉ thị cuộn lùi giao tác? Khi nào bạn cần xem xét đến mô hình giao tác lập trình so với mô hình giao tác khai báo? Bạn sẽ tối ưu các giao tác ra sao để có được những hệ thống hiệu năng cao? Các mô hình giao tác tự chúng không thể trả lời những câu hỏi này Đúng hơn, bạn phải giải quyết những vấn đề ấy hoặc bằng việc xây dựng chiến lược giao tác riêng của bạn hoặc bằng việc tuân theo một trong bốn chiến lược giao tác chính mà tôi giới thiệu trong bài viết này

Như bạn đã thấy ở bài viết đầu tiên trong loạt bài này, nhiều cạm bẫy thường gặp trong giao tác có thể ảnh hưởng đến các hành vi giao tác, và do đó, làm giảm tính toàn vẹn và nhất quán của dữ liệu Tương tự như vậy, việc thiếu một chiến lược giao tác hiệu quả cũng sẽ có ảnh hưởng tiêu cực đến tính toàn vẹn và nhất quán của dữ liệu Các mô hình giao tác mà tôi mô tả trong bài viết này là những khối xây dựng nền tảng để phát triển một chiến lược giao tác hiệu quả Hiểu sự khác nhau của các mô hình này và cách thức chúng hoạt động là tối quan trọng để hiểu

về những chiến lược giao tác có sử dụng chúng Sau khi mô tả ba mô hình giao tác, tôi sẽ giới thiệu bốn chiến lược giao tác áp dụng cho hầu hết các ứng dụng kinh doanh, từ những ứng dụng Web đơn giản đến các hệ thống lớn xử lý giao tác

tốc độ cao Các bài viết tiếp sau trong loạt bài về Các chiến lược giao tác sẽ mô tả

các chiến lược này ở mức chi tiết hơn

Mô hình giao tác cục bộ

Mô hình có tên là Mô hình giao tác cục bộ do xuất phát từ thực tế là các giao tác này bị quản lý bởi trình quản lý tài nguyên cơ sở dữ liệu mức dưới, chứ không phải bởi thùng chứa hay khung công tác mà trình ứng dụng đang chạy Trong mô

hình này, bạn quản lý các kết nối hơn là quản lý các giao tác Như đã tìm hiểu

trong “Hiểu những cạm bẫy trong giao tác”, bạn không thể dùng mô hình giao tác cục bộ khi bạn thực hiện cập nhật cơ sở dữ liệu bằng cách dùng khung công tác ánh xạ quan hệ - đối tượng như Hibernate, opLink hoặc Java Persistence API (JPA) Bạn vẫn còn có thể áp dụng mô hình này khi dùng đối tượng truy nhập dữ liệu (DAO) hoặc khung công tác dựa trên JDBC và các thủ tục cơ sở dữ liệu lưu sẵn

Trang 3

Bạn có thể sử dụng mô hình giao tác cục bộ theo một trong hai cách sau: để cơ sở

dữ liệu quản lý kết nối hoặc quản lý kết nối theo chương trình Để cơ sở dữ liệu quản lý kết nối, bạn đặt thuộc tính autoCommit của đối tượng JDBC Connection là true (giá trị mặc định), điều này là để báo cho hệ quản trị cơ sở dữ liệu bên dưới (DBMS) giao kết mỗi giao tác sau khi hoàn tất thao tác chèn, cập nhật hay xóa hoặc là cuộn lùi để hủy bỏ công việc nếu thất bại Kỹ thuật này được minh họa trong Liệt kê 1, thực hiện chèn một lệnh mua bán chứng khoán vào bảng TRADE:

Liệt kê 1 Các giao tác cục bộ với chỉ một thao tác cập nhật

public class TradingServiceImpl {

public void processTrade(TradeData trade) throws Exception {

Connection dbConnection = null;

try {

DataSource ds = (DataSource)

(new InitialContext()).lookup("jdbc/MasterDS");

dbConnection = ds.getConnection();

dbConnection.setAutoCommit(true);

Statement sql = dbConnection.createStatement();

String stmt = "insert into TRADE ";

sql.executeUpdate(stmt1);

} finally {

if (dbConnection != null)

dbConnection.close();

}

Trang 4

}

}

Trong Liệt kê 1, lưu ý rằng autoCommit được đặt giá trị true, để báo cho DBMS biêt rằng các giao tác cục bộ cần được giao kết sau mỗi câu lệnh cơ sở dữ liệu Kỹ thuật này sẽ làm việc tốt nếu bạn chỉ có duy nhất một hành động duy trì cơ sở dữ liệu trong một đơn vị công việc logic (LUW) Tuy nhiên, giả sử phương thức processTrade() như trong Liệt kê 1 cũng cập nhật số dư tài khoản trong bảng ACCT để phản ánh giá trị của lệnh mua bán Trong trường hợp này, hai hành động của cơ sở dữ liệu sẽ là độc lập với nhau, việc chèn vào bảng TRADE được giao kết với cơ sở dữ liệu trước việc cập nhật vào bảng ACCT Nếu việc cập nhật vào bảng ACCT thất bại, sẽ không có cơ chế cuộn lùi để hủy bỏ lệnh chèn vào bảng TRADE, kết quả là dữ liệu mất tính nhất quán trong cơ sở dữ liệu

Kịch bản này đưa tới kỹ thuật thứ hai: quản lý các kết nối theo chương trình Trong kỹ thuật này, bạn đặt thuộc tính autoCommit của đối tượng Connection là false và tự mình thực hiện giao kết hoặc cuộn lùi kết nối một cách thủ công Liệt

kê 2 minh họa kỹ thuật này:

Liệt kê 2 Các giao tác cục bộ với nhiều cập nhật

public class TradingServiceImpl {

public void processTrade(TradeData trade) throws Exception {

Connection dbConnection = null;

try {

DataSource ds = (DataSource)

(new InitialContext()).lookup("jdbc/MasterDS");

dbConnection = ds.getConnection();

Trang 5

dbConnection.setAutoCommit(false);

Statement sql = dbConnection.createStatement();

String stmt1 = "insert into TRADE ";

sql.executeUpdate(stmt1);

String stmt2 = "update ACCT set balance ";

sql.executeUpdate(stmt2);

dbConnection.commit();

} catch (Exception up) {

dbConnection.rollback();

throw up;

} finally {

if (dbConnection != null)

dbConnection.close();

}

}

}

Trong Liệt kê 2, ta để ý thấy thuộc tính autoCommit được đặt là false, để báo cho DBMS nằm dưới biết kết nối sẽ được quản lý trong mã lệnh, chứ không phải là do

cơ sở dữ liệu Trong trường hợp này, bạn phải gọi phương thức commit() của đối tượng Connection nếu tất cả đều ổn; trái lại, gọi phương thức rollback() nếu xảy ra ngoại lệ Bằng cách này, bạn có thể phối hợp 2 hành động của cơ sở dữ liệu trong cùng một đơn vị công việc

Trang 6

Mặc dù mô hình giao tác cục bộ ngày nay có vẻ lỗi thời, nó vẫn là một phần tử quan trọng cho một trong những chiến lược giao tác chính mà tôi sẽ đề cập đến ở cuối bài viết này

Mô hình giao tác theo lập trình

Mô hình giao tác theo lập trình mang tên như vậy bắt nguồn từ thực tế là người phát triển ứng dụng chịu trách nhiệm về việc quản lý giao tác Trong mô hình giao

tác theo lập trình, không giống như mô hình giao tác cục bộ, bạn quản lý các giao tác và chúng độc lập với những kết nối cơ sở dữ liệu nằm dưới

Giống như ví dụ trong Liệt kê 2, trong mô hình này người phát triển ứng dụng chịu trách nhiệm lấy một giao tác từ trình quản lý giao tác, khởi động giao tác này, giao kết giao tác và, nếu có trường hợp ngoại lệ xảy ra, thì cuộn lùi để hủy giao tác Như bạn có lẽ cũng đoán được, điều này sẽ dẫn tới các mã lệnh dễ mắc lỗi và chúng có xu hướng lẫn vào logic kinh doanh trong trình ứng dụng của bạn Tuy nhiên, một số chiến lược giao tác đòi hỏi sử dụng mô hình giao tác theo lập trình

Mặc dù các khái niệm là tương đương nhau, việc thực thi mô hình giao tác theo lập trình không giống nhau giữa Spring Framework và đặc tả EJB 3.0 Trước tiên, tôi sẽ minh họa cách thực thi mô hình này sử dụng EJB 3.0, sau đó cho thấy cũng các cập nhật cơ sở dữ liệu tương tự dùng Spring Framework

Các giao tác theo lập trình với EJB 3.0

Trong EJB 3.0, bạn nhận được một giao tác từ trình quản lý giao tác (hay nói cách khác là thùng chứa) bằng cách thực hiện một tra cứu JNDI (Java Naming và

Directory Interface) tìm một javax.transaction.UserTransaction Khi bạn có một UserTransaction, bạn có thể gọi phương thức begin() để khởi động một giao tác, gọi phương thức commit() để giao kết giao tác này, và gọi phương thức rollback() cuộn lùi để hủy bỏ giao tác nếu xảy ra lỗi Trong mô hình này, thùng chứa sẽ không tự động giao kết hoặc hủy bỏ giao tác; chính là trách nhiệm của người phát triển lập trình các hành vi này trong các phương thức Java thực hiện cập nhật cơ sở

dữ liệu Liệt kê 3 cho ta một ví dụ về mô hình giao tác theo lập trình của EJB 3.0 dùng JPA:

Liệt kê 3 Các giao tác theo lập trình sử dụng EJB 3.0

Trang 7

@Stateless

@TransactionManagement(TransactionManagementType.BEAN)

public class TradingServiceImpl implements TradingService {

@PersistenceContext(unitName="trading") EntityManager em;

public void processTrade(TradeData trade) throws Exception {

InitialContext ctx = new InitialContext();

UserTransaction txn = (UserTransaction)ctx.lookup("UserTransaction"); try {

txn.begin();

em.persist(trade);

AcctData acct = em.find(AcctData.class, trade.getAcctId());

double tradeValue = trade.getPrice() * trade.getShares();

double currentBalance = acct.getBalance();

if (trade.getAction().equals("BUY")) {

acct.setBalance(currentBalance - tradeValue);

} else {

acct.setBalance(currentBalance + tradeValue);

}

txn.commit();

Trang 8

} catch (Exception up) {

txn.rollback();

throw up;

}

}

}

Khi sử dụng mô hình giao tác theo lập trình trên nền Java, trong môi trường thùng chứa Enterprise Edition (Java EE) với một bean phiên phi trạng thái (stateless session bean), bạn phải thông báo cho thùng chứa biết bạn đang dùng các giao tác theo lập trình Bạn thông báo bằng cách dùng chú giải @TransactionManagement

và thiết đặt kiểu của giao tác là BEAN Nếu không sử dụng chú giải này, thùng chứa sẽ giả thiết là bạn đang dùng bộ quản lý (CONTAINER) giao tác khai báo, đây là kiểu giao tác mặc định của EJB 3.0 Khi bạn dùng các giao tác theo lập trình ở tầng ứng dụng khách bên ngoài bối cảnh của một bean phiên phi trạng thái, bạn không cần thiết đặt kiểu giao tác

Các giao tác theo lập trình với Spring

Khung công tác Spring có hai cách thực thi mô hình giao tác theo lập trình Cách thứ nhất là thông qua TransactionTemplate của Spring và cách thứ hai là sử dụng

trực tiếp trình quản lý giao tác nền Spring Vì tôi không hào hứng với các lớp bên

trong không tên và những mã lệnh khó đọc, tôi sẽ dùng cách thứ hai để minh họa

mô hình giao tác theo lập trình trong Spring

Spring có ít nhất chín trình quản lý giao tác nền Những cái thường dùng nhất là DataSourceTransactionManager, HibernateTransactionManager,

JpaTransactionManager, và JtaTransactionManager Mã lệnh ví dụ của tôi sử dụng JPA, do đó tôi sẽ đưa ra cấu hình dành cho JpaTransactionManager

Để cấu hình JpaTransactionManager trong Spring, đơn giản chỉ cần định nghĩa một bean trong tệp XML về bối cảnh trình ứng dụng bằng cách dùng lớp

org.springframework.orm.jpa.JpaTransactionManager và bổ sung thêm một tham chiếu đến bean JPA Entity Manager Factory Sau đó, giả sử rằng Spring quản lý

Trang 9

lớp đang chứa logic trình ứng dụng của bạn, nội xạ (tiêm) trình quản lý giao tác vào trong bean như trong Liệt kê 4

Liệt kê 4 Định nghĩa trình quản lý giao tác Spring JPA

<bean id="transactionManager"

class="org.springframework.orm.jpa.JpaTransactionManager">

<property name="entityManagerFactory" ref="entityManagerFactory"/>

</bean>

<bean id="tradingService" class="com.trading.service.TradingServiceImpl"> <property name="txnManager" ref="transactionManager"/>

</bean>

Nếu Spring không quản lý lớp ứng dụng, trong phương thức của mình bạn có thể nhận được một tham chiếu đến trình quản lý giao tác bằng cách dùng phương thức getBean() trong bối cảnh Spring

Trong mã nguồn, bây giờ bạn có thể dùng trình quản lý nền để lấy một giao tác Khi tất cả các cập nhật đã hoàn thành, bạn có thể gọi phương thức commit() để giao kết giao tác, hoặc phương thức rollback() cuộn lùi để hủy bỏ giao tác Liệt kê

5 minh họa kỹ thuật này:

Liệt kê 5 Sử dụng trình quản lý giao tác Spring JPA

Trang 10

public class TradingServiceImpl {

@PersistenceContext(unitName="trading") EntityManager em;

JpaTransactionManager txnManager = null;

public void setTxnManager(JpaTransactionManager mgr) {

txnManager = mgr;

}

public void processTrade(TradeData trade) throws Exception { TransactionStatus status =

txnManager.getTransaction(new DefaultTransactionDefinition()); try {

em.persist(trade);

AcctData acct = em.find(AcctData.class, trade.getAcctId()); double tradeValue = trade.getPrice() * trade.getShares(); double currentBalance = acct.getBalance();

if (trade.getAction().equals("BUY")) {

acct.setBalance(currentBalance - tradeValue);

} else {

acct.setBalance(currentBalance + tradeValue);

}

txnManager.commit(status);

Ngày đăng: 07/08/2014, 10:22

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w