Hi,
Each of the methods you call on the atlas bean instance is in its own
transaction, so there are no db changes to roll back in the transaction for
your atlas.fail() call. If you want several methods on your atlas bean to
happen one after another in just one transaction, you should write a
session bean that does this within one method call. Trying to do
transaction control from outside the ejb container is usually a bad idea:
the transaction control is really the main reason for the container to be
there in the first place (imho).
david jencks
On 2001.06.23 21:26:46 -0400 Pedro E. Gomez wrote:
> Hello.
>
> I am having a problem with transactions.
>
> I want to have a client which use differents components at the same time.
>
> And in some cases i need to use differents methods of a componet. This
> last one is which i describe in this message, becouse of is the simple
> case.
>
> The problem that i am having is when the las method fails there is not a
> rollback and if i see the DB the changes have been alread made.
>
>
> My client application is like this:
>
>
> public class AtlasClient {
> public static void main(String[] args) {
> System.setProperty("java.naming.factory.initial",
> "org.jnp.interfaces.NamingContextFactory");
> System.setProperty("java.naming.provider.url", args[0]);
>
> try {
>
>
> InitialContext context = new InitialContext();
> Object ref = context.lookup("pgomez/ejb/Atlas");
> AtlasHome home = (AtlasHome)PortableRemoteObject.narrow(ref,
> AtlasHome.class);
> Atlas atlas = home.create();
>
> Country country;
> country = atlas.getCountry(1);
> country.setUpdateDate(new Date());
> atlas.update(country);
>
> country = new Country();
> country.setNombre("Country " + Math.random());
> atlas.createCountry(country);
>
>
> atlas.fail();
> } catch (NamingException e) {
> System.out.println("NamingException");
> e.printStackTrace();
> } catch (RemoteException e1) {
> System.out.println("RemoteException");
> e1.printStackTrace();
> } catch (CreateException e1) {
> System.out.println("CreateException");
> e1.printStackTrace();
> }
> }
> }
>
> The fail method throws a RunTimeException.
> When i check the db the changes are there.
>
>
>
> The component look like this:
>
>
>
> protected AtlasDAO dao;
>
> public void init() {
> dao = new AtlasDAO();
> }
>
> public void destroy() {
> dao = null;
> }
>
> public void createCountry(Pais pais) {
> dao.createCountry(pais);
> }
>
> public void update(Country country) {
> dao.store(country);
> }
>
> public void fail() {
> throw new RunTimeException();
> }
>
> public Country getCountry(int id) {
> return dao.getCountry(id);
> }
>
>
> In each DAO'S method i get the connection and i release the connection.
> My DAO looks like this:
>
> /** DAO Constructor */
>
> private void AtlasDAO() {
> InitialContext context = new InitialContext();
> datasource = (DataSource) ic.lookup(JNDINames.ATLAS_DATASOURCE);
> }
>
>
> private void getDBConnection () {
> dbConnection = datasource.getConnection();
> }
>
> private void closeConnection() {
> dbConnection.close();
> }
>
> ....
>
> private Country getCountry(int id) throws DAOException {
>
>
> try {
> getDBConnection();
> .....
> .....
> .....
> } catch (...) {
>
> } finally {
> closeResultSet(rs);
> closeStatement(stmt);
> closeConnection();
> }
> }
>
>
>
> The Atlas descriptor is:
>
>
>
> <enterprise-beans>
> <session>
> <ejb-name>pgomez/ejb/Atlas</ejb-name>
> <home>co.com.pragma.pgomez.atlas.ejb.AtlasHome</home>
> <remote>co.com.pragma.pgomez.atlas.ejb.Atlas</remote>
> <ejb-class>co.com.pragma.pgomez.atlas.ejb.AtlasEJB</ejb-class>
> <session-type>Stateless</session-type>
> <transaction-type>Container</transaction-type>
>
> </session></enterprise-beans>
> <assembly-descriptor>
> <container-transaction>
> <method>
> <ejb-name>pgomez/ejb/Atlas</ejb-name>
> <method-name>*</method-name>
> </method>
> <method>
> <ejb-name>pgomez/ejb/Atlas</ejb-name>
> <method-intf>Remote</method-intf>
> <method-name>*</method-name>
> </method>
> <method>
> <ejb-name>pgomez/ejb/Atlas</ejb-name>
> <method-intf>Home</method-intf>
> <method-name>*</method-name>
> </method>
> <trans-attribute>required</trans-attribute>
> </container-transaction>
>
> </assembly-descriptor>
>
>
>
> My jboss.jcml is attached.
> I only have change the JDBC stuff.
>
> My DATABase:
> Oracle 8.15
>
> My Driver JDBC
> classes12.zip (From oracle)
>
> My client os:
> Windows NT 4.0
>
>
> The jboss os:
> It is runnig over solarix
>
> The jdk:
> 1.3
>
>
>
> Is possible what i want or not?
>
> If no why not an if yes how can i do that?
>
> Thanks a lot.
>
>
> ______________________________________
> Message sent with Misiva
> Visit us at http://www.pragma.com.co/misiva
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-user