当前位置: 首页 > 知识库问答 >
问题:

手动处理事务而不是JtaTransactionManager

孔瑾瑜
2023-03-14

我正在处理一个多数据库的设置,技术栈的spring和hibernate在Tomcat6上运行。跨数据库的事务不是必需的,每个数据库都有自己的dataSource、sessionFactory和transactionManager(org.springframework.orm.Hibernate3.HibernateTransactionManager),并声明性地使用事务管理(@Transactional annotation)。最近,有一种要求,即在其中两个DBs(例如db1和db2)中进行一次性插入是事务性的。

举个例子,能不能有下面这样的东西?

Transaction transactionDb1 =     sessionFactoryDb1.getCurrentSession().beginTransaction();
Transaction transactionDb2 = sessionFactoryDb2.getCurrentSession().beginTransaction();
try
{
    // DAO layer call to DB1
    // DAO layer call to DB2

    transactionDb1.commit();
    transactionDb2.commit();
}
catch (Exception e) {
    transactionDb1.rollback();
    transactionDb2.rollback();
}

可能不会那么简单。但这样的事情可能吗?据我所知,可以使用编程事务处理。但是如何结合声明性方法来完成呢?我还能在其他情况下使用@transactional吗?任何帮助都将不胜感激。

共有1个答案

齐阳
2023-03-14

您可以对多个非JTA数据源使用编程事务,但不会有任何全局事务。每个数据源都将使用自己独立的事务,因此如果第一个提交而第二个回滚,您将没有机会回滚已经提交的第一个事务。

Spring@Transactional注释只能针对一个TransactionManager,并且由于不使用JTA,所以可以选择一个SessionFactory或DataSource。这就是为什么您只能依赖JtatransactionManager来实现自动事务管理。如果您不想要JTA,您将不得不编写自己的事务管理代码。

 类似资料:
  • 我目前正在开发Jersey/Hibernate web服务(在Tomcat 9容器中),它应该能够使用和生成JSON(应用程序/JSON)和XML(应用程序/XML)。它支持GET和POST来使用这些类型。DELETE是受支持的,并且可以工作,对于JSON,GET和POST也是如此。但是,当我尝试使用XML内容类型时,我得到了一个500内部服务器错误。 结构如下:(检查下面的代码)歌曲列表(son

  • 当使用事务处理时,需要创建 Session 对象。在进行事务处理时,可以混用 ORM 方法和 RAW 方法,如下代码所示: func MyTransactionOps() error { session := engine.NewSession() defer session.Close() // add Begin() before any action

  • 启动事务 $this->db->start(); Swoole::$php->db('slave2')->start(); 提交事务 $this->db->commit(); Swoole::$php->db('slave2')->commit(); 回滚事务 $this->db->rollback(); Swoole::$php->db('slave2')->rollback();

  • 在2.0.0之后我们已经支持事务嵌套了,是通过事务等级去实现的。 1. 开始事务 $model->beginTransaction(); 2. 事务提交 $model->commit(); 3. 事务回滚 $model->rollback();

  • 事务处理(transaction processing) 可以用来维护数据的完整性,保证SQL的操作要么完全执行,要么完全不执行,如果发生错误就进行撤销。 保证数据的完整性。 保证数据不受外影响。 事务处理的几道术语 事务(transaction) 一组SQL语句 退回(rollback)撤销执行SQL语句的过程 提交(commit) 将为执行的SQL语句写入数据库表 保留点(savepoint)

  • ORM 可以简单的进行事务操作 o := NewOrm() err := o.Begin() // 事务处理过程 ... ... // 此过程中的所有使用 o Ormer 对象的查询都在事务处理范围内 if SomeError { err = o.Rollback() } else { err = o.Commit() }