我有InnoDB引擎的表(tahminler,用户),我读到InnoDB使用行锁并具有MVCC功能,即使有同时写查询,这两件事也可以执行读查询(SELECT查询)(更新或插入)。
我的网站中有以下情况: 1. user1使用以下代码在两个表中插入信息:
$id=$_POST['id'];
$user_id=$_POST['user_id'];
$tahmin=$_POST['tahmin'];
$tahmin_text=$_POST['tahmin_text'];
include_once("mysql.class.php");
include_once("config.php");
$db1;
$db1 = new db_mysql($conf['db_hostname'], $conf['db_username'], $conf['db_password'], $conf['db_name']);
$current_server_date = date('Y-m-d H:i:s');// Your local server time
date_default_timezone_set('Asia/Istanbul');
$current_pc_date = date('Y-m-d H:i:s');
$sql1 = $db1->query("INSERT INTO tahminler (tahmin, tahmin_text, match_id, user_id, timestamp)
VALUES ('$tahmin','$tahmin_text', $id, $user_id, '$current_pc_date')");
$sql1 = $db1->query("UPDATE `users`
SET daily_tahmin =(daily_tahmin+1), monthly_tahmin =(monthly_tahmin+1)
WHERE id=$user_id");
2.同时另一个用户user2正在尝试询问上一个表的信息:
$sql1 = $db1->query("SELECT * FROM tahminler");
$sql1 = $db1->query("SELECT * FROM users");
当user2要求从数据库中读取一些信息时,即使表的引擎是InnoDB,但数据库会阻止读取请求,直到user1完成写入查询。
我更改了上面的代码,并添加了一些代码来解决问题,使用如下的交易:
$id=$_POST['id'];
$user_id=$_POST['user_id'];
$tahmin=$_POST['tahmin'];
$tahmin_text=$_POST['tahmin_text'];
include_once("mysql.class.php");
include_once("config.php");
$db1;
$db1 = new db_mysql($conf['db_hostname'], $conf['db_username'], $conf['db_password'], $conf['db_name']);
$db1->query("SET AUTOCOMMIT=0");//new
$db1->query("START TRANSACTION");//new
$current_server_date = date('Y-m-d H:i:s');// Your local server time
date_default_timezone_set('Asia/Istanbul');
$current_pc_date = date('Y-m-d H:i:s');
$sql1 = $db1->query("INSERT INTO tahminler (tahmin, tahmin_text, match_id, user_id, timestamp)
VALUES ('$tahmin','$tahmin_text', $id, $user_id, '$current_pc_date')");
$sql1 = $db1->query("UPDATE `users`
SET daily_tahmin =(daily_tahmin+1), monthly_tahmin =(monthly_tahmin+1)
WHERE id=$user_id");
$db1->query("COMMIT");//new
我添加了三行,以便在事务中执行更新和插入的查询,让其他表格和记录可读,但不幸的是,读取块仍然是在添加这些行之后,所以任何身体可以告诉我是否有任何遗漏的查询或我在这里犯了什么错误?