请长时间问我......
我必须将一个数据库记录添加到一个主表中,比如说test
表。在向此表添加记录后,我想要其last inserted id
,然后想要在事务表中添加大约1000个条目(同时向这些1000条记录发送EMAILS),请说test_transaction
表。
但是第二个操作,将记录添加到事务表中,需要更多的时间来向数据库添加记录。我正在使用客户MVC,我的代码看起来像......
public function addtotest()
{
$strSql = "INSERT INTO test ...";
$intId = $this->db->execute($strSql);
foreach($arrTransaction $transact)
{
$strSql = "INSERT INTO test_transaction ...";
$this->db->execute($strSql);
}
echo $intId;
}
所以我想把test_transaction
表的条目放到另一个action
中,如下所示
public function testtrancation()
{
$id = $_REQUEST['id']; //It's understood that I am doing proper validation here
foreach($arrTransaction $transact)
{
$strSql = "INSERT INTO test_transaction ...";
$this->db->execute($strSql);
}
}
所以主要问题是,我正在调用来自addtotest
的{{1}}行动,当它会回复AJAX
时,我想调用另一个id
来增加近似值AJAX
{1}}记录到数据库。
但是我不想让用户等待几分钟的1000
条记录来打扰用户的体验。
1000
'AJAX'电话加入记录后重新加载页面。addtotest
的{{1}}内拨打另一个AJAX
来电。拨打success
addtotest
电话后,我正在重新加载我的网页。
testtransaction
但是当页面重新加载时,我的AJAX
调用也会在没有完成$.ajax(
{
url: SERVER_PATH + 'addtotest',
type: 'post',
async: true,
data: { required_data: required_date },
success:function(data)
{
alert('Record added successfully.');
//I DO NOT WANT USERS TO WAIT FOR THIS AJAX CALL
$.ajax(
{
url: SERVER_PATH + 'testtransaction',
type: 'post',
async: true,
data: { intId: data.id },
success:function(data)
{
//DO NOTHING
},
});
//I DO NOT WANT USERS TO WAIT FOR THIS AJAX CALL
location.reload();
},
});
请求的情况下消失。
在这种情况下可以做到吗?我想了解更多细节,请告诉我。
我不希望用户等待另外的AJAX
条目(以及发送EMAILS到这1000条记录)进入数据库。
答案 0 :(得分:3)
然后创建一个数据库触发器。 所以当Record在第一个表中插入时 它插入到事务表或SO中。
例子 -
CREATE TRIGGER trg_Table1_INSERT
ON dbo.Table1 AFTER INSERT
AS BEGIN
INSERT INTO dbo.Table2(SerialNo, Name)
SELECT SerialNo, Name
FROM Inserted
INSERT INTO dbo.Table3(SomeOtherCol)
SELECT SomeOtherCol
FROM Inserted
END
答案 1 :(得分:1)
这很简单!
单次插入后,您可以调用单独的后台进程:
public function addtotest()
{
$strSql = "INSERT INTO test ...";
$intId = $this->db->execute($strSql);
exec('php /your/php/cli/script.php param1 param2 paramN 1>> /dev/null 2>> /dev/null &');
echo $intId;
}
使用"&"进程在后台启动,因此您可以继续,而不必等到脚本完成。
或者您可以将此作业添加到"延期任务"并使用cron运行此任务。
答案 2 :(得分:1)
不要使用AJAX。你需要具有基本分页的CRONJOB。
在一个php文件中提取ID,并在每个序列的每500个请求之后的列表序列之后。并且使用header()重定向下一个500,直到你到达终点。这不会影响用户体验,ypu会有很好的表现。
答案 3 :(得分:1)
您可以使用一个SQL查询插入所有行。
INSERT INTO test_transaction (col1, col2)
VALUES (value11, value12),
(value21, value22),
(value31, value32),
...
(value10001, value10002);