EJB事务管理

EJB transaction management

我正在尝试了解 EJB 事务管理。我写了下面的代码并部署在 websphere liberty

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class BookRepositoryBean {

  @Resource(lookup = "jdbc/mydb")
  private DataSource dataSource;

  public void create(List<Book> books) {

  try {
    for(Book book: books) {
      Connection con = dataSource.getConnection();
      PreparedStatement stmt = con.preparedStatement("insert into ....");
      stmt.setString(1, ...);
      stmt.executeUpdate();
    }
  } catch(SQLException e) {
    throw new RuntimeException(e.getMessage());
  }
}

我的 server.xml 如下所示

<dataSource jndiName="jdbc/mydb" transactional="false">
....
</dataSource>

我在 table 中手动插入了一条具有主键约束的记录,然后尝试 运行 我的代码保留两条记录,其中一条是重复记录,另一条是新记录。

我尝试了不同的选项并观察到以下情况

  1. Server XML datasource: transactional=false
    TransactionManagementType=BEAN
    Result: 1/2 records persisted. Since there is no transaction management code written, this is expected.

  2. Server XML datasource: transactional=true
    TransactionManagementType=CONTAINER
    Result: 0/2 records persisted. Since transaction management is enabled 0 records are inserted.

  3. Server XML datasource: transactional=false
    TransactionManagementType=CONTAINER
    Result: 1/2 records persisted

  4. Server XML datasource: transactional=true
    TransactionManagementType=BEAN
    Result: 1/2 records persisted. I understood that, since I turned off transaction management at code level, 1 record has been persisted.

  5. Server XML datasource: transactional=true
    Removed @Stateless and @TransactionManagement annotations
    Result: 0/2 records persisted.

情况3,我不明白为什么要插入1条记录。我假设容器级别的事务管理只有在代码中启用并且在容器级别启用时才会起作用。我说的对吗?

在案例 5 中,我不明白为什么当 class 不是 EJB 时会保留 0 条记录。我一直认为事务管理只能用于 EJB。这个测试证明我错了。现在我不明白为什么要选择 EJB 而不是常规 java class.

谁能解释一下?

  1. Server XML datasource: transactional=false
    TransactionManagementType=CONTAINER
    Result: 1/2 records persisted

    In case 3, I dont understand why 1 record is inserted. I am assuming container level transaction management will work only when enabled in code and also by enabling at container level. Am i right?

即使容器正在管理此 EJB 中的事务,如果资源无法参与事务(即 transactional=false),那么每个操作都会单独执行。插入重复键失败,插入另一个键成功。

关于#5,通过删除注释并使其成为正常的 java class,它在调用者的事务和上下文中运行。调用者是另一个具有容器管理事务的 EJB 吗?