我正在处理一个多数据库的设置,技术栈的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吗?任何帮助都将不胜感激。
您可以对多个非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() }