PHP与MYSQL的并发性
我的php应用程序与mysql数据库存在并发问题。我有一个过程,通过这个过程,应用程序从sql server 2005数据库中获取数据,并将这些数据插入我的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
$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