我正在使用db_transaction()进行一些数据更新。我正在使用一些EntityMetadataWrappers,修改一些数据,然后保存。
问题是,包装器->save()函数没有实体控制器那样的$transaction参数:entity_get_controller($entity_type)->save($entity, $transaction)。
如果我不传递一个事务,当事务已经存在时,它将调用db_transaction()。
注意:我使用的是MariaDB。
发布于 2019-09-04 18:47:53
我终于在交易文件中找到了对这种情况下发生的事情的解释。
虽然我们不能在PHP中声明函数“事务性”,但是我们可以通过使用带有构造函数和析构函数的对象来模拟Java的嵌套逻辑。函数只需调用"$transaction = 数据库_交易();“作为它的第一个(或几乎第一个)操作,以使自己具有事务性。如果一个事务函数调用另一个事务,我们的事务抽象层通过在内部嵌套层中不执行事务操作(就数据库所见)来嵌套它们。要启动一个新事务,只需在您自己的代码中调用
$transaction = db_transaction();。只要变量$transaction保持在作用域内,事务将保持开放状态。当$transaction被销毁时,事务将被提交。如果您的事务嵌套在另一个事务中,那么Drupal将跟踪每个事务,并且只在最后一个事务对象超出范围时提交最外层的事务,也就是说,所有相关的查询都已成功完成。
https://drupal.stackexchange.com/questions/285028
复制相似问题