如何将两个数据库的事务一起使用?

时间:2015-11-24 08:15:26

标签: php mysql database transactions yii2

有两个数据库:DB1,DB2。 这些数据库在桌面上:DB1.groups [id,name]和DB2.keywords [id,name,group_id]。 DB1.groups.id - 它是DB2.keywords.group_id的外键

任务是:获取数据 - >处理数据 - >更新DB1.groups - >更新DB2.keywords。 伪代码实现:

//begin transaction for DB1;
begin_transaction('db1');
try {
    $a = get_data()
    $a = handle1($a);
    insert_to_db1($a);
    insert_to_db2($a); // here the query gets stuck and throws an error  “Lock wait timeout exceeded; try restarting transaction” 
    commit_transaction('db1');
} catche(\Exception $e) {
    rollback_transaction('db1');
}

原因是我阻止了DB1中的行并更新了第二个数据库DB2中的表,它冻结了,因为我在锁定记录DB1的外键中有它(请求它等待DB1中的解锁行)。如果我将删除外键 - 一切都很快完成。

如何解决这个问题?我理解单个数据库的事务是原子的,但是我对同一个数据库的原子性有一点问题。我需要一起使用两个数据库的事务。 我不想删除外键来解决这个问题。 我很害怕在没有事务的情况下使用它(当更新一个DB时我会遇到很大问题。)

如何解决问题?

0 个答案:

没有答案