首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用db_transaction()保存实体包装器?

使用db_transaction()保存实体包装器?
EN

Drupal用户
提问于 2019-09-04 15:54:58
回答 1查看 93关注 0票数 0

我正在使用db_transaction()进行一些数据更新。我正在使用一些EntityMetadataWrappers,修改一些数据,然后保存。

问题是,包装器->save()函数没有实体控制器那样的$transaction参数:entity_get_controller($entity_type)->save($entity, $transaction)

如果我不传递一个事务,当事务已经存在时,它将调用db_transaction()

  • 在这种情况下,外部事务的提交或回滚会发生什么?
  • 如果创建了一个新事务,该事务是否提交了已经存在的事务?
  • 如果外部回滚不会回滚内部的回滚,或者在创建新的回滚时会造成混乱,那么是否有办法在一个事务中完成所有这些呢?

注意:我使用的是MariaDB。

EN

回答 1

Drupal用户

回答已采纳

发布于 2019-09-04 18:47:53

我终于在交易文件中找到了对这种情况下发生的事情的解释。

虽然我们不能在PHP中声明函数“事务性”,但是我们可以通过使用带有构造函数和析构函数的对象来模拟Java的嵌套逻辑。函数只需调用"$transaction = 数据库_交易();“作为它的第一个(或几乎第一个)操作,以使自己具有事务性。如果一个事务函数调用另一个事务,我们的事务抽象层通过在内部嵌套层中不执行事务操作(就数据库所见)来嵌套它们。要启动一个新事务,只需在您自己的代码中调用$transaction = db_transaction();。只要变量$transaction保持在作用域内,事务将保持开放状态。当$transaction被销毁时,事务将被提交。如果您的事务嵌套在另一个事务中,那么Drupal将跟踪每个事务,并且只在最后一个事务对象超出范围时提交最外层的事务,也就是说,所有相关的查询都已成功完成。

票数 0
EN
页面原文内容由Drupal提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://drupal.stackexchange.com/questions/285028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档