javascript - azure 自定义 API : performing database transaction returns a timeout

标签 javascript azure transactions

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

The request 'POST /api/saveinvite' has timed out. This could be caused by a script that fails to write to the response, or otherwise fails to return from an asynchronous call in a timely manner.

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 查询。如果您确实要传递大量值并且需要快速执行,则在存储过程中还可以执行 BULK INSERT。

修改数据库连接字符串中的 ConnectionTimeout 属性。 您可以修改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 门户上的日志以查看是否是权限问题。

祝你好运!

关于javascript - azure 自定义 API : performing database transaction returns a timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130450/

相关文章:

javascript - 使用 Firebase 和 Azure 从 Microsoft 获取验证码时出错

java - 关于jpa 1.0事务并发的问题

sql-server - ColdFusion 8 执行 cfquery、事务和脏读

database - 交易最佳实践

javascript - Django 欧芹 : uncaught error

javascript - 如何使用 jquery 移动按钮并通过效果/动画方法查看它?

javascript - Node.js Promise.all() 挂起

Javascript RegEx 查找没有子字符串的变量字符串?

c# - 关系数据库的全文搜索?

azure - 在 Azure AD B2C 中注册 Azure AD Multi-Tenancy 应用程序的正确方法