我有一个laravel应用程序A,它有一个MySQL数据库DB1和一个表p1,还有一个不同的php应用程序B,它的MySQL数据库DB2中有一个等价表p2. 我希望找到最好、安全和完整的方法来至少从应用程序B更新DB1中的p1和DB2中的p2. 我有一些列只在p1中,一些列只在p2中,还有一些常见的列,但这些行有一对一的等价性,而不是一对多.它是来自现实世界的同一实体.

  1. 主要问题

我曾想过在应用程序B中使用一个事务来编辑表单,在该事务中,我用两个表各自的列和新值更新它们,但这会阻止来自两个数据库的记录吗?我有什么可担心的?

  1. 额外的风景

2.1.开始交易 2.2.我在DB1的p1中更新了一个FK列,它可以工作 2.3.当我完成事务时,有人在应用程序a中删除了fk对应表f1.id=p1.fk中的行 2.4.我在没有FK列的数据库DB2中进行更新; 2.5.我应该提交,或者它会给我一个错误(应该是这样),第一次更新无法执行?

  1. 澄清1

如果我还想在应用程序A中实现和编辑表单,同样的解决方案是否适用?我应该只在一个应用程序中更新吗?

  1. 澄清2

我应该使用哪些设置(如隔离级别)以及如何使用?代码示例将非常有用.

我愿意听取关于如何完成这项任务的建议.谢谢.

start transaction

UPDATE db1.p1 pp1 inner join db2.p2 pp2 on pp1.iddb2=pp2.id
    SET 
       pp1.fk_id=23,
       pp1.commoncol='a',
       pp2.commoncol='a',
       pp2.extracol='b'
WHERE pp2.id=123;

commit;

推荐答案

我不认为这有什么问题,但是...

  • 交易是"全部"或"无".

  • 事务必须从单个连接运行.并且两个数据库必须位于同一个MySQL实例中.(我们不讨论"两阶段提交".)如果您所说的"数据库"指的是"服务器",那么请在问题中明确说明这一点.

  • 禁止其他连接修改该事务中涉及的任何内容.

  • 你不需要观察其他连接在做什么,但是...

  • 您确实需要判断错误.一个连接可能会干扰另一个连接,系统将中止一个事务.通常,重新开始已终止的事务.

  • 使用默认的事务隔离.

  • 列是否为外键与本讨论无关.

  • 如果在事务内部,在决定做什么之前需要对一些数据进行SELECT,则使用SELECT ... FOR UPDATE.(我不知道拉维尔是如何揭露这一选项的.)

(我同意这样的 comments ,即拥有两个数据库并将其同步可能是对这项任务的"过度思考".)

Php相关问答推荐

调用woocommerce_customer_Save_add动作挂钩时发生致命错误

如果活动订阅者的购物车中有订阅项目,则在WooCommerce签出中显示通知

我如何知道BaseController中当前运行的是哪个控制器?

向在添加到购物车上动态创建的WooCommerce产品添加发货类别

PHP中冒号的奇怪用例

在特定订单状态更改时自定义WooCommerce订单发货项目

如何删除Foreach语句中的重复值?

在WooCommerce中的本地收件发货方式下添加一个 Select 字段

拉威尔10有许多通过获取所有祖父母数据的子元素S图像

Symfony框架锁定和.env设置

如何批量处理消息总线中的消息

使用 PHP,我可以将 foreach 语句放入瞬态中吗?

使用自定义插件中的 WooCommerce 模板发送自定义邮箱

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

Woocommerce注册中的自定义复选框验证错误提示问题

symfony/notifier + twig/inky-extra 在 dunglas/symfony-docker 中缺少 ext-xsl.

yii2 sql迁移覆盖新更改的记录

计算组合指数

使用 GROUP_CONCAT 规范化/转置来自查询的数据

使用 splat 运算符时按引用传递 (...)