Azure 自定义 API:执行数据库事务返回超时

azure custom apis: performing database transaction returns a timeout

本文关键字:数据库 事务 返回 超时 执行数 执行 自定义 API Azure      更新时间:2023-09-26

在 Azure 自定义 API 上,我正在尝试利用数据库转换对三个表执行批量插入操作。然后我在控制台上遇到此错误。

请求"POST/api/saveinvite"已超时。这可能是由于脚本无法写入响应,或者无法及时从异步调用返回导致的。

exports.post = function (request, response) {
console.log("save invite executed!!");
var jsonfriendcircle = request.body.jsonfriendcircle;
var jsoninviteelist = request.body.jsoninviteelist;
var jsoninviteefriendcirclelist = request.body.jsoninviteefriendcirclelist;
console.log("Circle is :" + jsonfriendcircle);
console.log("Inviteelist is :" + jsoninviteelist);
console.log("Inviteefriendcirclelist is :" + jsoninviteefriendcirclelist);
var parsedjsfrcircle = JSON.parse(jsonfriendcircle);
var mssql = request.service.mssql;
console.log("mssql obj :" + mssql);
mssql.open({
    success: function (connection) {
        console.log("connection to db success");
        console.log("circle id: " + parsedjsfrcircle["id"]);
        console.log("circle name :" + parsedjsfrcircle["circle_name"]);
        var sqlst1 = 'insert into friendcircle (id,circle_name)values(?,?)';
        connection.query(sqlst1, [parsedjsfrcircle["id"], parsedjsfrcircle["circle_name"]], function (err, results) {
            if (err) {
                console.log("Error:" + err);
                connection.rollback();
                response.send(statusCodes.Error, { message: '' });
                connection.close();
                return;
            } else {
                // connection.commit();
               // connection.close();
            }
        });

    }
    , error: function (err) {
        console.log("Unable to connect to DB :" + err);
        response.send(statusCodes.Error, { message: err });
    }
});
};

看起来你并没有试图做太多。 插入几百行应该在超时之前返回。如果移动服务用户对数据库表的权限存在问题,并且事务和自定义错误处理可能隐藏了该问题,则会出现超时。 确保您已运行

GRANT SELECT, INSERT, UPDATE ON OBJECT::[dbo].[Invitee_FriendCircle] TO [Created_MobileServicesLogin_User] 
--For whatever name was created when you made the app (not the name you entered when you created the app, but the wacky one that mobile services made)

可以尝试的一些方法:确保要插入到的表已针对您正在执行的插入类型编制索引。 如果它是一个巨大的表并且索引是一个问题,请让移动 api 插入到一个小临时表中,然后使用 sp_start_job 运行异步作业以使用临时表更新主表。 这样,您就不会在表执行更新时等待。

在包含插入的数据库中编写存储过程,并将变量传递到其中,而不是在此处编写 INSERT 查询。 在 sproc 中,如果您确实要传递大量值并且需要快速完成,您也可以执行批量插入。

修改数据库的连接字符串中的"连接超时"属性。您可以修改 request.service.config.sqlConnectionString。

尝试将其剥离以找到问题。 删除事务,然后尝试在没有事务和自定义错误处理程序的情况下执行此操作,一次只对一个表执行。 尝试

exports.post = function(request, response) {
var jsonfriendcircle=request.body.jsonfriendcircle;
var jsoninviteelist=request.body.jsoninviteelist;
var jsoninviteefriendcirclelist=request.body.jsoninviteefriendcirclelist;
var mssql=request.service.mssql; 
var sqlst1='insert into FriendCircle (id,circle_name)values(?,?)' ;
mssql.query(sqlst1,[jsonfriendcircle.id,jsonfriendcircle.circle_name], {
        success: function(results) {
             response.send(statusCodes.OK, { message : 'success' });
        },
        error: function(err) {
           console.log("error is: " + err);
        }
    });   
};
一次

尝试一个,看看是否有任何失败,如果失败,请检查 Azure 门户上的 LOGS,看看是否是权限问题。

祝你好运!

可能是 30 秒后事务超时?在 SQL 中,默认的最大事务超时是多少

尝试将插入重写为多个较小的事务