我有带有 InnoDB 引擎的表(tahminler,用户),我读到 InnoDB 使用行锁并具有 MVCC 功能,这两件事使得即使有同时写入查询(UPDATE 或 INSERT)也可以执行读取查询(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 完成他的写入查询。
我更改了上面的代码并添加了一些行来解决使用 Transactions feauter 的问题,如下所示:
$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
我添加了三个新行以在事务中执行更新和插入的查询,以让其他表和记录的读取成为可能,但不幸的是,即使在添加这些行之后读取块仍然保持原样,所以任何人都可以告诉如果有任何遗漏的查询或者我在这里犯了任何错误?