Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.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/0/backbone.js/2.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与MYSQL的并发性_Php_Mysql_Concurrency - Fatal编程技术网

PHP与MYSQL的并发性

PHP与MYSQL的并发性,php,mysql,concurrency,Php,Mysql,Concurrency,我的php应用程序与mysql数据库存在并发问题。我有一个过程,通过这个过程,应用程序从sql server 2005数据库中获取数据,并将这些数据插入我的mysql数据库,首先检查这些数据当前是否不存在。。问题是这个过程是由许多用户执行的,如果两个人同时运行,我会遇到并发问题,应用程序不会意识到只有另一个终端输入了数据。 让我举一个简单的例子让你明白: $mylastPatientId = 1000; //SEARCH FOR NEW PATIENTES IN SQL SERVER THAT

我的php应用程序与mysql数据库存在并发问题。我有一个过程,通过这个过程,应用程序从sql server 2005数据库中获取数据,并将这些数据插入我的mysql数据库,首先检查这些数据当前是否不存在。。问题是这个过程是由许多用户执行的,如果两个人同时运行,我会遇到并发问题,应用程序不会意识到只有另一个终端输入了数据。 让我举一个简单的例子让你明白:

$mylastPatientId = 1000;
//SEARCH FOR NEW PATIENTES IN SQL SERVER THAT AR NOT IN MYSQL
$sql="SELECT ID,FULLNAME FROM PATIENTS WHERE ID > $mylastPatientId ";
$result=odbc_exec($conn,$sql)or die(exit("Error en odbc_exec"));
while (odbc_fetch_row($result))
{
    $id = odbc_result($result, "ID");
    $fullname = odbc_result($result, "FULLNAME");
    $resultMySql = mysql_query("SELECT * FROM patients where id = $id ", $conexion);
    if (mysql_affected_rows() ==0)
    {
        mysql_query("INSERT INTO patients (id,fullname) values ($id,$fullname);", $conexion);
    }
}
请注意,这只是一个简化的例子,我有一个更大的过程,但这就是我的想法。代码块是新发明的,并没有经过验证。
很好,这里的问题是,当两个终端同时执行此过程时,这不会检测到另一个终端已经插入到患者,因此,患者会被插入两次。

我认为最简单的解决方案是对patients.id创建唯一的约束,使用INSERT IGNORE而不是INSERT

您在MySQL中使用的是什么数据库引擎?首先切换到InnodDB,然后,它是符合ACID的MyISAM,而不是使用行锁定而不是表锁定;然后使用单个INSERT IGNORE语句,而不是单独的SELECT和INSERT语句使用InnoDB的新名称创建表,将数据从旧表传输到新表,删除旧表,将新表重命名为旧表名不起作用。还在复制记录。你的表上有索引吗?如果是,索引是什么?我不能这样做。实际上插入的表格不是病人的表格,病人只是一个例子。我的桌子是一家医院的看护队列。病人可以改天再来。我的表的键是一个自动增量队列id