CMT回滚:如何回滚事务

时间:2012-01-16 02:38:17

标签: ejb-3.0

即使我在update()方法中抛出空指针异常,以下代码也无助于回滚。如果我运行代码,每次它都会将值插入数据库。如果在update()方法中抛出空指针,请帮助我如何回滚事务。我在代码中遗漏了什么吗?

@TransactionManagement(value = TransactionManagementType.CONTAINER)
public class Bean implements RemoteIF {

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void insertIntoDb() {

        insert();
        update();


    }


    private Integer update() {
val=0;      
try {
            Connection con = DbConn.getConnection();
            Statement st = con.createStatement();
            val1 = st.executeUpdate("INSERT INTO tab VALUES('ab')");
            st.close();
            throw new NullPointerException();

        } catch (Exception e) {
            System.out.println(e);
        }

        return val;
    }

    private Integer insert() {
        int val = 0;

        try {

            Connection con = DbConn.getConnection();
            Statement st = con.createStatement();
            val = st.executeUpdate("INSERT INTO tab VALUES('bnm')");
            st.close();

        } catch (Exception e) {
            System.out.println(e);
        }

        return val;
    }
}

1 个答案:

答案 0 :(得分:0)

对我怀疑的事情很可疑。

  • @Stateless课程中没有@Stateful@SingletonBean注释。除非您在ejb-jar.xml文件中声明了bean,否则这不会被识别为EJB。绝对要仔细检查一下。

  • DbConn.getConnection()看起来很可疑,您可能正在尝试自己管理数据库连接。如果您有任何使用DriverManagernew FooDataSource()的代码,那肯定是问题所在。如果您希望事务管理工作,您必须通过

    从容器中获取所有资源
    • 通过EJB类中的@Resource DataSource datasource字段注入
    • java:comp/env/yourDataSource的JNDI查找,其中yourDataSource是您在ejb-jar.xml中配置或通过使用@Resource(type=DataSource.class, name="youDataSource")在bean类上声明的数据源的名称 - 该注释继续上课而不是方法或领域。

有关交易管理如何运作的一些见解,请参阅这些答案: