EJB3事务测试用例

环境:

Jboss4.3

EJB3

 

线程和事务:

>>在同一个无状态Bean中,如果调用的第一个方法没有事务,那在第一个方法里调用的Bean里其它的方法也将没有事务,不管其它方法的事务配置。事务的特性将由第一个确定,同一个Bean里,不能使用多事务。

>>在同一个无状态Bean中,不管调用的第一个方法有或者没有事务,在第一个方法里通过多线程调用的Bean里其它的方法也将没有事务,不管其它方法的事务配置。也就是说在多线程里面,事务不具有传递特性。这个容易理解,因为多线程里的错误不能在原调用或者启动的方法里捕获。

>>在不同的无状态Bean中, 无论调用的Bean中是否有事务,只好被调用的另一个Bean中有相应的事务,则可以正常运行。事务在这种情况下有传递性。

>>在不同的无状态Bean中, 无论调用的Bean中是否有事务,它通过多线程调用的另一个Bean中有相应的事务,则可以正常运行。由于事务可以控制在局部的另一个Bean里,所以这里可以有事务的存在,但它不是由启动新线程的父方法的事务传递过来的,它是自己维护的,换句话说,这里事务同样不具有传递特性。 

 

总结:事务在多线程情况下,不具有传递性。在同一个Bean中,由最先调用的方法决定是否有事务。在不同的Bean中,可以由其它被调用Bean的方法进行内部事务控制,但最先调用Bean的方法的事务有传递性。

 

多数据源和事务(这里的Jboss没有对多数据源事务支持):

>>在同一个无状态Bean中,如果调用的方法没有事务,且在此方法里的多数据源都只进行只读,没有问题。

>>在同一个无状态Bean中,如果调用的方法没有事务,且在此方法里的多数据源一个进行只读,另一个进行读写,没有报错。但数据不会写到数据库。

>>在同一个无状态Bean中,如果调用的方法有事务,且在此方法里的多数据源都进行只读,则报错。

>>在同一个无状态Bean中,如果调用的方法有事务,且在此方法里的多数据源一个进行只读,另一个进行读写,则报错。

>>在同一个无状态Bean中,如果调用的方法有事务,且在此方法里的多数据源两个都进行读写,则报错。

>>在同一个无状态Bean中,不同的方法中有不同数据源的调用,此时,事务会由最先调用的方法决定,如果最先调用的方法是只读事务,则不会报错,但不同数据源都不能进行写事务操作。如果最先调用的方法是写事务,则会报错,与在同一个方法里调用效果一样。

>>同一个无状态Bean中,多线程条件下,由于事务在多线程里不具有传递性,所以当在一个方法里的多数据源一个在新线程里,一个在原线程里,都不会报错,但由于新线程没有事务,所以无法进行写事务操作。

>>在不同的无状态Bean中,如果调用的Bean里的方法没有事务,而在另一个Bean里有事务,由于事务在不同Bean里有局部性控制,所以不会报错。

>>在不同的无状态Bean中,如果调用的Bean里的方法有事务,而在另一个Bean里未显式指定事务,由于事务在不同Bean里有传递性,所以会报错。

>>在不同的无状态Bean中,如果调用的Bean里的方法有事务,而在另一个Bean里有事务,由于事务在不同Bean里有传递性,所以会报错。

>>在不同的无状态Bean中,如果调用的Bean里的方法有事务,而在另一个Bean里有新事务,由于事务在不同Bean里有局部性控制,所以不会报错。

>>在不同的无状态Bean中,多线程条件下,由于事务可以控制在局部的另一个Bean里,所以这里可以有事务的存在,但它不是由启动新线程的父方法的事务传递过来的,它是自己维护的,换句话说,这里事务同样不具有传递特性。 

 

总结多数据源:事务在多线程情况下,不具有传递性。在同一个Bean中,由最先调用的方法决定是否有事务,有事务情况下,多数据源都只能读,不能写,否则报错。在不同的Bean中,可以由其它被调用Bean的方法进行内部事务控制,但最先调用Bean的方法的事务有传递性。

你可能感兴趣的:(EJB3)