我正在使用node-sqlite3,但我确信这个问题也出现在另一个数据库库中。我在混合事务和异步代码的代码中发现了一个错误。
function insertData(arrayWithData, callback) {
// start a transaction
db.run("BEGIN", function() {
// do multiple inserts
slide.asyncMap(
arrayWithData,
function(cb) {
db.run("INSERT ...", cb);
},
function() {
// all done
db.run("COMMIT");
}
);
});
}
// some other insert
setInterval(
function() { db.run("INSERT ...", cb); },
100
);
Run Code Online (Sandbox Code Playgroud)
您还可以运行完整的示例。
问题是,在or之后的异步暂停期间,可以启动带有insert或查询的其他一些代码。然后这个额外的查询在事务中运行。当事务提交时这不是问题。但是,如果事务回滚,则此额外查询所做的更改也会回滚。哎呀,我们刚刚意外地丢失了数据,但没有任何错误消息。updatebegininsert
我考虑过这个问题,我认为一个解决方案是创建一个包装类,以确保:
但这听起来像是太复杂的解决方案。有更好的方法吗?你如何处理这个问题?
例如我有一个方法
\nvoid process(String userId) {\n if(userId == null) throw new IlligalArgumentException("User ID is required");\n\n User user = userService.findUserById(userId);\n\n if(user == null) throw new UserNotFoundException("User with ID: "+ userId +" not found");\n \n try {\n DataResponse response = analyticsAPI.loadAnalytics(userId, user.getDob(), user.getFirstName()); \n\n //logic\n } catch(AnalyticsAPIException e) {\n //logic\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nIlligalArgumentException是未经检查的异常UserNotFoundException是未经检查的异常AnalyticsAPIException是已检查的异常我读到,最好的做法是从 try 开始该方法并以 catch 结束,而不是在一个方法中乘以 try-catch 块。
\n\n优先使用异常而不是错误代码 我们更喜欢使用异常而不是错误代码\n因为它们更加明确。在处理 try / …
architecture ×1
asynchronous ×1
exception ×1
java ×1
node.js ×1
refactoring ×1
sqlite ×1
transactions ×1