1 / 27

Transactions

CG0165: Advanced Applications Development in Java. Transactions. Michael Brockway Sajjad Shami. Northumbria University School of Computing, Engineering & Information Sciences. Distributed Transactions. Distributed transactions- Intro Bean managed transactions

kerem
Télécharger la présentation

Transactions

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CG0165: Advanced Applications Development in Java • Transactions Michael Brockway Sajjad Shami Northumbria University School of Computing, Engineering & Information Sciences

  2. Distributed Transactions • Distributed transactions- Intro • Bean managed transactions • Container managed transactions • References: • Tutorial and reference material on the sun web site - Enterprise Edition pages • http://java.sun.com/javaee/5/docs/tutorial/doc/ • Also installed in lab machines. • Look at chapter 34

  3. Distributed Transactions • A ‘transaction’ keeps user data in a consistent state: • it has an identifiable beginning. • when successfully complete, it is committed. • if something goes wrong during the transaction, the system state (data) can be rolled back. • Example: Transfer money from Account 1 in Bank 1 to Account 5 in Bank 6 • withdraw from Account 1; deposit in Account 5; update history log • if the deposit does not complete successfully, roll back the withdrawal! • if log not updated successfully, roll back deposit, & withdrawal!

  4. Distributed Transactions …contd • enterprise applications access and store information in one or more databases • because this information is critical for business operations, it must be accurate, current, and reliable. • data integrity would be lost if multiple programs were allowed to update the same information simultaneously • it would also be lost if a system that failed while processing a business transaction were to leave the affected data only partially updated • by preventing both of these scenarios, software transactions ensure data integrity • transactions control the concurrent access of data by multiple programs. • In the event of a system failure, transactions make sure that after recovery the data will be in a consistent state

  5. Distributed Transactions … • Java EE supports distributed transactions • across multiple databases or multiple application servers • In Java EE there is a choice of two methods for defining transaction boundaries: • Bean-managed transaction demarcation • requires the EJB developer to code the transaction boundaries manually in the EJBs using the Java transaction API (JTA) • methods begin(), commit(), rollback() • Container-managed transaction demarcation • allows the developer to specify transaction boundaries in declarations whilst deploying EJBs

  6. Container-Managed Transactions • with container-managed transaction demarcation, the EJB container sets the boundaries of the transactions • can be used with any type of enterprise bean: session, or message-driven • simplify development because the enterprise bean code does not explicitly mark the transaction’s boundaries • code does not include statements that begin and end the transaction • by default if no transaction demarcation is specified enterprise beans use container-managed transaction demarcation

  7. CMT …. contd. • CMTs do not require all methods to be associated with transactions • when developing a bean, can specify which of the bean’s methods are associated with transactions by setting the transaction attributes • enterprise beans that use container-managed transaction demarcation must not use any transaction management methods that interfere with the container’s transaction demarcation boundaries • examples of such methods are the commit, setAutoCommit, and rollback methods of java.sql.Connection or the commit and rollback methods of javax.jms.Session

  8. Transaction Attributes • A transaction attribute is used to control the scope of a transaction. Controlling the scope is important

  9. TA values • Required • RequiresNew • Mandatory • NotSupported • Supports • Never • Required • if the client is running within a transaction and invokes the enterprise bean’smethod, the method executes within the client’s transaction • if the client is not associated with a transaction, the container starts a new transaction before running the method

  10. TA values …contd • RequiresNew • if the client is running within a transaction and invokes the enterprise bean’s method, the container takes the following steps: • 1. Suspends the client’s transaction • 2. Starts a new transaction • 3. Delegates the call to the method • 4. Resumes the client’s transaction after the method completes • if the client is not associated with a transaction, the container starts a new transaction before running the method. • Mandatory • if the client is running within a transaction and invokes the enterprise bean’s method, the method executes within the client’s transaction • if the client is not associated with a transaction, the container throws the transactionRequiredException.

  11. TA values …contd • NotSupported • if the client is running within a transaction and invokes the enterprise bean’s method, the container suspends the client’s transaction before invoking the method • after the method has completed, the container resumes the client’s transaction • Supports • if the client is running within a transaction and invokes the enterprise bean’s method, the method executes within the client’s transaction • Never • if the client is running within a transaction and invokes the enterprise bean’s method, the container throws a RemoteException • In each of the above, if the client is not associated with a transaction, the container does not start a new transaction before running the method

  12. How to Set Transaction Attributes • transaction attributes are specified by decorating the enterprise bean class or method with javax.ejb.TransactionAttribute annotation, and setting it to one of the javax.ejb.TransactionAttributeType contants • the TransactionAttributeType constants encapsulate the transaction attributes described earlier • Example: • Required: TransactionAttributeType.REQUIRED • …….

  13. How to use @TransactionAttribute annotation: @TransactionAttribute(NOT_SUPPORTED) @Stateful public class TransactionBean implements Transaction { ... @TransactionAttribute(REQUIRES_NEW) public void firstMethod() {...} @TransactionAttribute(REQUIRED) public void secondMethod() {...} public void thirdMethod() {...} public void fourthMethod() {...} }

  14. Rolling back a CMT • two ways: • 1) if a system exception is thrown, the container will automatically roll back the transaction • 2) by invoking the setRollbackOnly method of the EJBContext interface, the bean method instructs the container to roll back the transaction • if the bean throws an application exception, the rollback is not automatic but can be initiated by a call to setRollbackOnly

  15. Synchronizing a Session Bean’s InstanceVariables • the SessionSynchronization interface (optional), allows stateful session bean instances to receive transaction synchronization notifications • for example, you could synchronize the instance variables of an enterprise bean with their corresponding values in the database. • the container invokes the Session-Synchronization methods—afterBegin, beforeCompletion, and afterCompletion—at each of the main stages of a transaction

  16. Bean Managed Transactions • also called application-managed transactions • the code in the session or message-driven bean explicitly marks the boundaries of the transaction • although beans with container-managed transactions require less coding, they have one limitation: • when a method is executing, it can be associated with either a single transaction or no transaction at all • if this limitation will make coding your bean difficult, you should consider using bean-managed transactions

  17. BMT example begin transaction ... update table-a ... if (condition-x) commit transaction else if (condition-y) update table-b commit transaction else rollback transaction begin transaction update table-c commit transaction • JDBC or JTA ?

  18. What is JTA • Java Transaction API • allows you to demarcate transactions in a manner that is independent of the transaction manager implementation • The Application Server implements the transaction manager with the Java Transaction Service (JTS) • code doesn’t call the JTS methods directly • instead, it invokes the JTA methods, which then call the lower level JTS routines. • to demarcate a JTA transaction, invoke the begin, commit, and rollback methods of the javax.transaction.UserTransaction interface

  19. JTA vs JDBC in a Stateful SB • Note: In a stateless session bean with bean-managed transactions, a business method must commit or roll back a transaction before returning • not required for a stateful session bean • Stateful Session Bean • with JTA transaction, the association between the bean instance and the transaction is retained across multiple client calls • even if each business method called by the client opens and closes the database connection the association is retained until the instance completes the transaction • with a JDBC transaction, the JDBC connection retains the association between the bean instance and the transaction across multiple call • if the connection is closed, the association is not retained.

  20. BMT Methods • EJBContext interface • getRollbackOnly() not allowed • setRollbackOnly() not allowed • UserTransaction interface • getStatus() • rollback() • methods of java.sql.Connection • commit() • setAutoCommit() • rollback() • getUserTransaction() method of javax.ejb.EJBContext • any method of javax.transaction.UserTransaction

  21. Transaction Timeouts • for container-managed transactions, the transaction timeout interval can be controlled • by setting the value of the timeout-in-seconds property • in the domain.xml file, which is in the config directory • for example, you would set the timeout value to 5 seconds as follows: timeout-in-seconds=5 • with this setting, if the transaction has not completed within 5 seconds, the EJB container rolls it back • when the Application Server is first installed, the timeout value is set to 0: timeout-in-seconds=0 • if the value is 0, the transaction will not time out

  22. Updating Several Databases • Java EE transaction manager • controls all enterprise bean transactions except for bean-managed JDBC transactions. • allows an enterprise bean to update multiple databases within a transaction. Updating multiple databases Updating multiple databases across Java EE servers

  23. Transactions in Web Components • a transaction in a web component can be demarcated by using either the java.sql.Connectionor javax.transaction.UserTransaction interface • these are the same interfaces that a session bean with bean-managed transactions can use • transactions demarcated with the UserTransaction interface are handled with JTA Transactions • an example of a web component using transactions is Duke’s Bookstore application in the Java EE Tutorial • in the <INSTALL>/javaeetutorial5/examples/web/bookstore1/ directory

  24. Accessing Databases • data that is shared between web components and is persistent between invocations of a web application is usually maintained by a database • web components use the Java Persistence API to access relational databases • the data for Duke’s Bookstore is maintained in a database and is accessed through the database access class database.BookDBAO. • for example, ReceiptServlet invokes the BookDBAO.buyBooks method to update the book inventory when a user makes a purchase • the buyBooks method invokes buyBook for each book contained in the shopping cart, as shown in the following code.

  25. buyBooks method public void buyBooks(ShoppingCart cart) throws OrderException{ Collection items = cart.getItems(); Iterator i = items.iterator(); try { while (i.hasNext()) { ShoppingCartItem sci = (ShoppingCartItem)i.next(); Book bd = (Book)sci.getItem(); String id = bd.getBookId(); int quantity = sci.getQuantity(); buyBook(id, quantity); } } catch (Exception ex) { throw new OrderException("Commit failed: " + ex.getMessage()); } }

  26. buyBook method public void buyBook(String bookId, int quantity) throws OrderException { try { Book requestedBook = em.find(Book.class, bookId); if (requestedBook != null) { int inventory = requestedBook.getInventory(); if ((inventory - quantity) >= 0) { int newInventory = inventory - quantity; requestedBook.setInventory(newInventory); } else{ throw new OrderException("Not enough of " + bookId + " in stock to complete order."); } } } catch (Exception ex) { throw new OrderException("Couldn't purchase book: “ + bookId + ex.getMessage()); } }

  27. buyBooks method in a Transaction try { utx.begin(); bookDB.buyBooks(cart); utx.commit(); } catch (Exception ex) { try { utx.rollback(); } catch(Exception e) { System.out.println("Rollback failed: "+e.getMessage()); } System.err.println(ex.getMessage()); orderCompleted = false; }

More Related