1 45 package org.openejb.resource.jdbc; 46 47 import javax.resource.spi.LocalTransaction ; 48 49 import org.openejb.util.Logger; 50 import org.openejb.util.Messages; 51 52 public class JdbcLocalTransaction implements LocalTransaction { 53 54 protected java.sql.Connection sqlConn; 55 protected JdbcManagedConnection managedConn; 56 protected boolean isActiveTransaction = false; 57 58 protected static final Messages messages = new Messages( "org.openejb.util.resources" ); 59 protected static final Logger logger = Logger.getInstance( "OpenEJB.resource.jdbc", "org.openejb.util.resources" ); 60 61 public JdbcLocalTransaction(JdbcManagedConnection managedConn) { 62 this.sqlConn = managedConn.getSQLConnection(); 63 this.managedConn = managedConn; 64 } 65 66 67 public void begin() throws javax.resource.ResourceException { 68 if(isActiveTransaction){ 69 throw new javax.resource.spi.LocalTransactionException ("Invalid transaction context. Transaction already active"); 70 } 71 try{ 72 sqlConn.setAutoCommit(false); 73 isActiveTransaction = true; 74 }catch(java.sql.SQLException sqlE){ 75 isActiveTransaction = false; 76 throw new javax.resource.spi.ResourceAdapterInternalException ("Can not begin transaction demarcation. Setting auto-commit to false for transaction chaining failed"); 77 } 78 managedConn.localTransactionStarted(); 79 } 80 81 public void commit() throws javax.resource.ResourceException { 82 if(isActiveTransaction){ 83 isActiveTransaction = false; 84 try{ 85 sqlConn.commit(); 86 }catch(java.sql.SQLException sqlE){ 87 String msg = messages.format( "jdbc.commit.failed", formatSqlException( sqlE )); 88 logger.error( msg ); 89 throw new javax.resource.spi.LocalTransactionException ( msg ); 90 } 91 managedConn.localTransactionCommitted(); 92 try{ 93 sqlConn.setAutoCommit(true); 94 }catch(java.sql.SQLException sqlE){ 95 throw new javax.resource.spi.ResourceAdapterInternalException ("Setting auto-commit to true to end transaction chaining failed"); 96 } 97 }else{ 98 throw new javax.resource.spi.LocalTransactionException ("Invalid transaction context. No active transaction"); 99 } 100 } 101 102 public void rollback() throws javax.resource.ResourceException { 103 if(isActiveTransaction){ 104 isActiveTransaction = false; 105 106 try{ 107 sqlConn.rollback(); 108 }catch(java.sql.SQLException sqlE){ 109 String msg = messages.format( "jdbc.rollback.failed", formatSqlException( sqlE )); 110 logger.error( msg ); 111 throw new javax.resource.spi.LocalTransactionException ( msg ); 112 } 113 114 managedConn.localTransactionRolledback(); 115 116 try{ 117 sqlConn.setAutoCommit(true); 118 }catch(java.sql.SQLException sqlE){ 119 throw new javax.resource.spi.ResourceAdapterInternalException ("Setting auto-commit to true to end transaction chaining failed"); 120 } 121 }else{ 122 throw new javax.resource.spi.LocalTransactionException ("Invalid transaction context. No active transaction"); 123 } 124 } 125 126 131 protected void cleanup() throws javax.resource.ResourceException { 132 if(isActiveTransaction){ 133 rollback(); 134 } 135 } 136 137 protected String formatSqlException(java.sql.SQLException e){ 138 return messages.format("jdbc.exception", e.getClass().getName(), e.getMessage(), e.getErrorCode()+"", e.getSQLState()); 139 } 140 } | Popular Tags |