Hello folks, I'm trying to create a trivial example of a transaction working correctly with MySQ L5.0.x and local-tx-datasource and Connector/J 3.x. I'm using Hibernate and EJB3, and JBoss 4.0.x. I cannot get transactions to rollback w/ SessionContext.setRollbackOnly() OR by throwing an uncaught EJB/Runtime exception.
Rolling back via the mysql command line client works great, and the tables in question are InnoDB. Here is my documentation of the problem -- I'd love it if anyone can tell me anything that looks weird. Please help -- this is so trivial it SHOULD work! mysql-ds.xml: | <?xml version="1.0" encoding="UTF-8"?> | <datasources> | <local-tx-datasource> | <jndi-name>MySqlDS</jndi-name> | <connection-url>jdbc:mysql://127.0.0.1:3306/scheduler_db</connection-url> | <driver-class>com.mysql.jdbc.Driver</driver-class> | <user-name>censored</user-name> | <password>censored</password> | <metadata> | <type-mapping>mySQL</type-mapping> | </metadata> | </local-tx-datasource> | </datasources> | persistence.xml: | <persistence> | <persistence-unit name="persistence-unit"> | <jta-data-source>java:/MySqlDS</jta-data-source> | <properties> | <property name="hibernate.hbm2ddl.auto" value="create-drop"/> | <property name="hibernate.connection.release_mode" value="auto"/> | <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> | </properties> | </persistence-unit> | </persistence> | My EJB3 session bean: | @Stateless | public class TestBean implements TestBeanLocal, TestBeanRemote | { | | @PersistenceContext(name = "persistence-unit") | EntityManager em; | | @Resource | SessionContext ctx; | | public static final String RemoteJNDIName = "example/" + TestBean.class.getSimpleName() + "/remote"; | public static final String LocalJNDIName = "example/" + TestBean.class.getSimpleName() + "/local"; | | @TransactionAttribute(TransactionAttributeType.REQUIRED) | public void test() | { | Book book = new Book(null, "My first book", "Person 1"); | em.persist(book); | | Book book2 = new Book(null, "My second book", "Person 2"); | em.persist(book2); | | System.out.println("CURRENT TRANSACTION STATUS 1: " + (ctx.getRollbackOnly() ? "ROLLBACK" : "NOT ROLLBACK")); | ctx.setRollbackOnly(); | System.out.println("CURRENT TRANSACTION STATUS 2: " + (ctx.getRollbackOnly() ? "ROLLBACK" : "NOT ROLLBACK")); | | Book book3 = new Book(null, "My third book", "Person 3"); | em.persist(book3); | | List someBooks = em.createQuery("from Book").getResultList(); | | for (Iterator iter = someBooks.iterator(); iter.hasNext();) | { | Book element = (Book) iter.next(); | em.remove(element); | } | } | My test client: | public static void main(String[] args) throws Exception | { | Properties properties = new Properties(); | properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); | properties.put("java.naming.factory.url.pkgs", "=org.jboss.naming:org.jnp.interfaces"); | properties.put("java.naming.provider.url", "localhost:1099"); | Context context = new InitialContext(properties); | | TestBeanRemote beanRemote = (TestBeanRemote) context.lookup(TestBean.RemoteJNDIName); | beanRemote.test(); | } | Output log from JBoss: | 2008-01-10 17:15:40,755 DEBUG [org.jboss.remoting.transport.socket.ServerThread] WAKEUP in SERVER THREAD | 2008-01-10 17:15:40,991 DEBUG [org.jboss.remoting.transport.socket.ServerThread] beginning dorun | 2008-01-10 17:15:41,211 DEBUG [org.hibernate.impl.SessionImpl] opened session at timestamp: 4915213685571584 | 2008-01-10 17:15:41,211 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join | 2008-01-10 17:15:41,211 DEBUG [org.hibernate.jdbc.JDBCContext] successfully registered Synchronization | 2008-01-10 17:15:41,211 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join | 2008-01-10 17:15:41,211 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Transaction already joined | 2008-01-10 17:15:41,220 DEBUG [org.hibernate.event.def.AbstractSaveEventListener] executing identity-insert immediately | 2008-01-10 17:15:41,224 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to open PreparedStatement (open PreparedStatements: 0, globally: 0) | 2008-01-10 17:15:41,224 DEBUG [org.hibernate.jdbc.ConnectionManager] opening JDBC connection | 2008-01-10 17:15:41,352 DEBUG [org.hibernate.SQL] insert into book (title, author) values (?, ?) | 2008-01-10 17:15:41,420 DEBUG [org.hibernate.id.IdentifierGeneratorFactory] Natively generated identity: 1 | 2008-01-10 17:15:41,420 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1) | 2008-01-10 17:15:41,420 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection | 2008-01-10 17:15:41,420 DEBUG [org.hibernate.jdbc.ConnectionManager] releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] | 2008-01-10 17:15:41,420 DEBUG [org.hibernate.event.def.AbstractSaveEventListener] executing identity-insert immediately | 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to open PreparedStatement (open PreparedStatements: 0, globally: 0) | 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.ConnectionManager] opening JDBC connection | 2008-01-10 17:15:41,421 DEBUG [org.hibernate.SQL] insert into book (title, author) values (?, ?) | 2008-01-10 17:15:41,421 DEBUG [org.hibernate.id.IdentifierGeneratorFactory] Natively generated identity: 2 | 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1) | 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection | 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.ConnectionManager] releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] | 2008-01-10 17:15:41,421 INFO [STDOUT] CURRENT TRANSACTION STATUS 1: NOT ROLLBACK | 2008-01-10 17:15:41,422 INFO [STDOUT] CURRENT TRANSACTION STATUS 2: ROLLBACK | 2008-01-10 17:15:41,422 DEBUG [org.jboss.ejb3.entity.ManagedEntityManagerFactory] ************** closing entity managersession ************** | 2008-01-10 17:15:41,447 DEBUG [org.jboss.remoting.transport.socket.ServerThread] begin thread wait | Book.java (the hibernate entity): | @Entity | @Table(name = "book") | @SequenceGenerator(name = "book_sequence", sequenceName = "book_id_seq") | public class Book implements Serializable | { | /** | * | */ | private static final long serialVersionUID = -9108127436362270765L; | private Integer id; | private String title; | private String author; | | public Book() | { | super(); | } | | public Book(Integer id, String title, String author) | { | super(); | this.id = id; | this.title = title; | this.author = author; | } | | @Override | public String toString() | { | | return "Book: " + getId() + " Title " + getTitle() + " Author " + getAuthor(); | } | | /** | * @return the author | */ | public String getAuthor() | { | return author; | } | | /** | * @param author the author to set | */ | public void setAuthor(String author) | { | this.author = author; | } | | /** | * @return the id | */ | @Id | @GeneratedValue(strategy = GenerationType.AUTO, generator = "book_sequence") | public Integer getId() | { | return id; | } | | /** | * @param id the id to set | */ | public void setId(Integer id) | { | this.id = id; | } | | /** | * @return the title | */ | public String getTitle() | { | return title; | } | | /** | * @param title the title to set | */ | public void setTitle(String title) | { | this.title = title; | } | | } | View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4118903#4118903 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4118903 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user