我正在尝试为我的node.js应用程序开发一个简单的框架,它允许我根据上下文和我需要完成的内容传递各种类型的可变查询序列。
难点在于,当插入/更新/删除语句时,它就像模块未能提交事务,并且数据库保持不受影响 - 这发生在单个查询和事务查询中,这对于交易来说尤其奇怪(我最后在那里调用conn.commit())。
差异:如果需要根据插入的行进行特殊处理,还可以动态提供解析脚本的结果。
class ExampleEntity: NSManagedObject {
...
override func awakeFromInsert() {
super.awakeFromInsert()
for (key, attr) in self.entity.attributesByName {
if attr.attributeType == .stringAttributeType && !attr.isOptional {
if self.value(forKey: key) == nil {
self.setPrimitiveValue("", forKey: key)
}
}
}
}
...
}
我尝试使用动态数组的promise deferments来控制事务流,我尝试让它们同步运行。我与数据库的所有连接都很好,当我使用与单个GET请求相同的连接或连接池时,它可以正常工作。我开始处理事务,因为使用INSERT,UPDATE或DELETE语句运行connection.query()在写入数据库时失败,这让我觉得我可能必须强制提交(尽管相同的查询有效)来自MySQL Workbench)。
单个连接和连接池都存在同样的问题:查询返回一个OkPacket,显示行已更改并插入,但是当我在MySQL Workbench中访问数据库时,它们不存在。
我在这里遗漏了什么吗?我对JavaScript的了解说这应该有效。这是我应该尝试的吗?是否有任何库或框架可以使node.js中的MySQL更简单?我正在使用的应用程序非常复杂,但我应该手动编写我的交易吗?
答案 0 :(得分:0)
好。我觉得很羞怯。
答案是代码没有任何问题,但数据库存在问题。在MySQL工作台中,在之前的调试过程中,我未经过查询>自动提交事务,导致事务和语句在第一个应用于给定行后仍然未提交(感谢InnoDB提供特定于行的锁)。
虽然答案与代码无关,但在初始化数据库对象后添加它可能会产生同样的效果:
pool.getConnection(function(err, conn){
if(err instanceof Error){ throw err; }
conn.query("SET AUTOCOMMIT=1", [], function(err){
if(err instanceof Error){
conn.release();
throw err;
}
console.log("Auto-commit Transactions Enabled.");
conn.release();
});
});
我还要了解MySQL是如何工作的。