Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将事务与两个数据库一起使用?_Php_Mysql_Database_Transactions_Yii2 - Fatal编程技术网

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

Php 如何将事务与两个数据库一起使用?,php,mysql,database,transactions,yii2,Php,Mysql,Database,Transactions,Yii2,有两个数据库:DB1、DB2。 这些数据库表上有:DB1.groups[id,name]和DB2.keywords[id,name,group\u id]。 DB1.groups.id-它是DB2.keywords.group\u id的外键 任务是:获取数据->处理数据->更新DB1.groups->更新DB2.keywords。 伪代码实现: //begin transaction for DB1; begin_transaction('db1'); try { $a = get_d

有两个数据库:DB1、DB2。 这些数据库表上有:DB1.groups[id,name]和DB2.keywords[id,name,group\u id]。 DB1.groups.id-它是DB2.keywords.group\u 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时,我会遇到大问题)


如何解决问题?

您需要使用一个数据库连接。@Vatev如何使用一个数据库连接来切换两个数据库?请运行
use
切换数据库,或者在查询中使用
。我认为唯一的方法是在开始任何事务之前知道组id。否则,在提交db1 trans之前,db2 trans不会看到db1中的更改