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 429 0
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

Đ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

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ộ  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. 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(); } } } 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(); 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. 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 @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(); } 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ý 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 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); [...]... sau đây Việc hiểu biết một cách đầy đủ sự khác nhau giữa các mô hình và cách chúng hoạt động là rất quan trọng trước khi bạn đi vào xây dựng một chiến lược giao tác Các chiến lược giao tác chính có thể sử dụng trong hầu hết các kịch bản ứng dụng kinh doanh l :  Chiến lược giao tác phối hợp phía khách  Chiến lược giao tác tầng API  Chiến lược giao tác tương tranh mức cao  Chiến lược giao tác xử lý... dụng thuộc tính giao tác Never và nhận được ngoại lệ khi gọi phương thức đang xét, bạn sẽ biết đang có giao tác hay không Nếu phương thức đó được phép thực hiện, bạn biết không có giao tác Đây là một cách thức tuyệt vời để đảm bảo rằng chiến lược giao tác của chúng ta là vững chắc Các chiến lược giao tác Các mô hình giao tác mô tả trong bài viết này tạo nên nền tảng của các chiến lược giao tác mà tôi sắp... cho các trình ứng dụng phía khách thông qua việc sử dụng các giao diện hoặc một API Đây là một trong những chiến lược giao tác phổ biến nhất Chiến lược giao tác tương tranh mức cao, một biến thể của chiến lược giao tác tầng API, được sử dụng trong các trình ứng dụng không thể hỗ trợ các giao tác chạy quá lâu từ tầng API (thường là vì lý do hiệu năng hay khả năng mở rộng) Đúng như cái tên của nó, chiến. .. hình giao tác khai báo, hay còn được gọi là Các giao tác do thùng chứa quản lý (Container Managed Transactions- CMT), là mô hình giao tác thường thấy nhất trên nền Java Trong mô hình này, môi trường thùng chứa đảm nhiệm việc khởi động, giao kết và cuộn lùi để hủy bỏ giao tác Người phát triển ứng dụng chỉ chịu trách nhiệm xác định cách hoạt động của giao tác Hầu hết các lỗi vấp phải trong giao tác được... tradeValue); } } } Các thuộc tính giao tác Ngoài các chỉ thị cuộn lùi, bạn cũng phải xác định các thuộc tính giao tác, chúng định nghĩa cách hành xử của các giao tác Java hỗ trợ sáu kiểu thuộc tính giao tác, bất kể bạn sử dụng EJB hay khung công tác Spring:  Required  Mandatory  RequiresNew  Supports  NotSupported  Never Trong khi mô tả từng thuộc tính giao tác này, tôi sẽ sử dụng một phương thức... đằng sau chiến lược giao tác này là rút ngắn phạm vi giao tác sao cho bạn tối thiểu việc khóa trong cơ sở dữ liệu, trong khi vẫn duy trì một đơn vị công việc nguyên tử cho bất cứ yêu cầu khách nào đã đưa ra Trong một vài trường hợp, bạn có thể cần phải tái cấu trúc lại logic của trình ứng dụng để hỗ trợ chiến lược giao tác này Chiến lược giao tác xử lý tốc độ cao có lẽ là chiến lược giao tác cực đoan... của loạt bài này có liên quan đến mô hình giao tác khai báo Cả khung công tác Spring lẫn EJB 3. 0 đều dùng các chú giải để xác định cách hoạt động của giao tác Spring dùng chú giải @Transactional, trong khi EJB 3. 0 dùng chú giải @TransactionAttribute Thùng chứa sẽ không tự động cuộn lùi giao tác khi có một ngoại lệ đã kiểm tra nếu bạn sử dụng mô hình giao tác khai báo Người phát triển ứng dụng phải xác... tác Spring và EJB 3. 0 Trong Spring, ta lấy ra một giao tác (cũng là khởi động luôn) bằng cách gọi phương thức getTransaction() trên trình quản lý giao tác nền Lớp không tên DefaultTransactionDefinition chứa các chi tiết về giao tác và cách hoạt động của nó, bao gồm tên của giao tác, mức phân lập, chế độ lan truyền (thuộc tính giao tác) và thời hạn chờ tối đa của giao tác (nếu có) Trong trường hợp này, ... năm làm việc với các trình ứng dụng và với các giao tác, tôi nhận ra rằng mặc dù tổ hợp của các mô hình, tùy chọn, thiết đặt và cấu hình có thể làm đau đầu và quá sức, trong thực tế chỉ một vài tổ hợp của các tùy chọn và thiết đặt là có ý nghĩa trong hầu hết các trường hợp Cả bốn chiến lược giao tác mà tôi đã xây dựng và sẽ thảo luận chi tiết trong loạt bài viết sau đây bao trùm hầu hết các kịch bản mà... cần tự hỏi mình, “Tính toàn vẹn và nhất quán của dữ liệu quan trọng đến mức nào?” Trong hầu hết các trường hợp, công sức phải bỏ ra để tái cấu trúc không ăn thua gì so với những rủi ro và cái giá phải trả liên quan đến dữ liệu xấu Mục lục  Mô hình giao tác cục bộ  Mô hình giao tác theo lập trình  Mô hình giao tác khai báo  Các chiến lược giao tác  Kết luận . 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. độ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. 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

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

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan