【问题标题】:How synchronization works?同步如何工作?
【发布时间】:2019-08-31 21:10:58
【问题描述】:

例如我有@Stateless java bean:

@Stateless(mappedName = "test") 
public class Test implements ITest
{
    @Override
    public void updateActivity
      (SomeObj activity)
      throws Exception
    {
        em.persist(activity);
    } 
}

因为它是一个容器管理的bean,那么告诉我,容器什么时候决定将上下文与数据库同步?在这种情况下,我会立即在数据库中看到结果,但有时它们似乎不会立即出现在那里,对吧?

请解释一下,在容器管理模式下,同步如何与上下文和数据库一起工作?容器何时决定将上下文与数据库同步?

【问题讨论】:

  • 你想说在这种情况下它总是会立即保存在数据库中?
  • 我想说这取决于您的事务范围和您查看数据库的方法。如果事务是容器管理的,一旦事务提交,它将在您的数据库中持久存在。在容器管理的情况下,这是您对容器的调用退出的时候。如果您使用 READ UNCOMMITED 查看数据库并打开 READ UNCOMMITED,您甚至会看到尚未提交的更改。
  • @cmoetzing “一旦事务提交” 什么时候?什么时候提交?容器何时决定将对象提交给数据库? (如果类和方法没有 TransactionAttribute 注释?)
  • @cmoetzing 对不起,你是什么意思? (“在容器管理的情况下,这是您对容器的调用退出时”)我不明白,对不起..

标签: java ejb-3.0


【解决方案1】:

这将由transaction propagation 配置驱动,因为您的 EJB bean 可能是参与单个事务的许多托管 bean 之一。如果有多个交易源在运行,这会变得更加复杂,例如XA 2PC。通常,更改将在事务提交时刷新到数据库中,但这进一步取决于使用嵌套事务时transaction isolation levelsavepoints 的存在。

查看@TransactionAttribute 注释文档或查找解释事务传播的tutorial

【讨论】:

  • 卡罗尔!是的,我知道 TransactionAttribute 注释。但是我关于bean和方法何时没有 TransactionAttribute 注释的问题。容器在我的示例中如何工作?容器何时决定将对象提交给 DB?
  • @denisaaa08 此信息均在文档中提供。请遵循@KarolDowbecki 提供的信息。 TransactionManagement@TransactionAttribute 都有 default values。仅仅因为你没有声明它并不意味着它没有被配置。例如,当您单击 UI 中的按钮时,您将进入您的容器。事务将在新页面呈现为对您的点击做出反应之前提交。
猜你喜欢
  • 2011-10-27
  • 2015-04-12
  • 1970-01-01
  • 2010-11-03
  • 2021-09-30
  • 2016-09-10
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多