使用 pg-promise 中断一个长事务
Interrupt a long transaction with pg-promise
我需要一种方法来拒绝此代码中的 pg-promise:
db.tx(async t => {
var file = await t.one(`insert into ui.user_datasets_files (user_dataset_id,filename) values (${itemId},'${fileName}') RETURNING id`);
var data = rows.map(row => {
return {
user_dataset_id: itemId,
file_id: file.id,
json_data: JSON.stringify(row)
};
});
const insert = pgPromise.helpers.insert(data, dataset_data_columns);
return t.none(insert);
}).then(() => callback()).catch(err => callback(err));
此行耗时较长,用户可以结束连接:
return t.none(insert);
所以,我想要一种方法来结束执行并在此事件中进行回滚:
req.on('close', function () {
promise.reject('Connection Closed');
});
Paginate/throttle 通过插入,并在每次插入之间检查事务是否需要中断,如果需要 - 抛出错误,事务将结束。
因此,例如,您可以执行 1000 行的 10 次插入,而不是在单次插入中插入 10,000 行。它的执行速度会稍微慢一点,但可以使您的事务在没有很大延迟的情况下可以中断。
您可以通过序列对数据进行分页,如 Data Imports 所示,或者如果所有数据都在内存中,则可以通过简单的循环进行分页。
in my code, all rows are in memory, how can i paginate the inserts?
db.tx(async t => {
while(/* there is data */) {
// get the next set of rows from memory;
const insert = pgPromise.helpers.insert(data, dataset_data_columns);
await t.none(insert)
.then(() => {
if(/* need to interrupt */) {
throw new Error('Interrupting transaction');
}
});
}
}).then().catch();
我需要一种方法来拒绝此代码中的 pg-promise:
db.tx(async t => {
var file = await t.one(`insert into ui.user_datasets_files (user_dataset_id,filename) values (${itemId},'${fileName}') RETURNING id`);
var data = rows.map(row => {
return {
user_dataset_id: itemId,
file_id: file.id,
json_data: JSON.stringify(row)
};
});
const insert = pgPromise.helpers.insert(data, dataset_data_columns);
return t.none(insert);
}).then(() => callback()).catch(err => callback(err));
此行耗时较长,用户可以结束连接:
return t.none(insert);
所以,我想要一种方法来结束执行并在此事件中进行回滚:
req.on('close', function () {
promise.reject('Connection Closed');
});
Paginate/throttle 通过插入,并在每次插入之间检查事务是否需要中断,如果需要 - 抛出错误,事务将结束。
因此,例如,您可以执行 1000 行的 10 次插入,而不是在单次插入中插入 10,000 行。它的执行速度会稍微慢一点,但可以使您的事务在没有很大延迟的情况下可以中断。
您可以通过序列对数据进行分页,如 Data Imports 所示,或者如果所有数据都在内存中,则可以通过简单的循环进行分页。
in my code, all rows are in memory, how can i paginate the inserts?
db.tx(async t => {
while(/* there is data */) {
// get the next set of rows from memory;
const insert = pgPromise.helpers.insert(data, dataset_data_columns);
await t.none(insert)
.then(() => {
if(/* need to interrupt */) {
throw new Error('Interrupting transaction');
}
});
}
}).then().catch();