如何使用PHP同时在两个数据库中更新MySQL表

yhuiod9q  于 5个月前  发布在  PHP
关注(0)|答案(2)|浏览(84)

我有一个laravel应用程序A与mysql数据库db 1和一个表p1和一个不同的php应用程序B与一个等效的表p2在其mysql数据库db2。我想找到最好的,安全和完整的方式来更新至少从应用程序B都p1在db 1和p2在db2。我有一些列只在p1,有些列只在p2和一些共同的列,但行有一个一对一的等价从来没有一对多。它是同一个实体,从真实的世界。
1.主体质询
我曾经想过在应用程序B中使用一个事务来编辑表单,在这个事务中,我用两个表各自的列和新值来更新这两个表,但是这会阻止来自两个数据库的记录吗?我需要担心什么?
1.额外场景
2.1.开始事务2.2.我在db 1的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;

字符串

eivnm1vs

eivnm1vs1#

我不认为这是一个问题 * 如果这两个数据库是在同一个MySQL示例 *,但.

  • 一个事务是“全部”或“无”。
  • 事务必须从单个连接运行。并且两个数据库必须在同一个MySQL示例中。(让我们不要谈论“两阶段提交”。)如果“数据库”是指“服务器”,那么在问题中要非常清楚。
  • 其他连接被阻止修改事务中涉及的任何内容。
  • 您不需要查看其他连接在做什么,但是...
  • 您确实需要检查错误。一个连接可能会干扰另一个连接,系统将中止一个事务。通常,重新启动已终止的事务。
  • 使用默认事务隔离。
  • 列是否为外键与此讨论无关。
  • 如果在一个事务中,你需要在决定做什么之前SELECT一些数据,使用SELECT ... FOR UPDATE。(我不知道Laravel是如何公开这个选项的。)

(我同意评论中的观点,即拥有两个数据库并同步它们可能是“过度思考”的任务。

flmtquvp

flmtquvp2#

同时对两个独立数据库中的数据进行更改,同时确保数据保持一致可能是一项棘手的工作。
如果你使用Laravel的Eloquent,你可以使用DB::transaction方法将你的更新分组到一个transaction中。
这里有一个Laravel的例子:

use Illuminate\Support\Facades\DB;

DB::transaction(function () {
    // Your database updates for application B
    // Update in db1.p1
    // Update in db2.p2
});

字符串
在您的场景中,如果您先修改p1中的外键,然后有人在db2中更新p2之前删除了db1中相应的行,那么在维护它们之间的关联时可能会遇到困难,这称为引用完整性问题。

相关问题