var config={
"host" : "localhost",
"database" : "test",
"user" : "root",
"password" : ""
},mysql=require("mysql");
var connection = mysql.createConnection(config);
connection.beginTransaction(function(err) {
if (err) { throw err; }
connection.query('INSERT INTO UserInfo (NickName,InterestClassId,InterestId,Activity,Version,CreateTime) VALUES (?,?,?,?,?,?)' ,[30, 17,18,1,1,new Date()]
, function(err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.query('INSERT INTO UserLoginInfo (UserId,LoginName,Password,CreateTime) VALUES (?,?,?,?) ,[17,18, 11,new Date()]
, function(err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log('success!');
});
});
});
});
代码想实现的逻辑是先插入用户信息到UserInfo表,成功后在把用户名插入UserLoginInfo表。如果插入UserLoginInfo不成功则回滚将之前插入UserInfo表的数据删除。UserLoginInfo表的LoginName有唯一性约束,我在测试的时候故意提供了一个重名的LoginName,代码抛出UserLoginInfo插入错误后应该要回滚,将之前插入UserInfo的删除。可是我在数据库里查看之前插入UserInfo的记录还在。这两张表的存储结构都是InnoDB。请问问题出在什么地方?谢谢
1:应该是可以的啊
2:你这样直接使用,事务代码和业务逻辑代码紧密耦合在一起,建议使用 bearcat-dao 来处理事务哈
1:可是之前插入UserInfo表的数据,无论之后插入UserLoginInfo表是否成功都一直存在,不会回滚,是不是mysql配置方面有问题呢?还是开发环境的问题,我是用的mac,被这个问题搞死了,要疯了~~~~ 2: bearcat-dao没使用过,我研究下,谢谢提醒
问题解决了,还是表的存储结构的问题,之前用phpmyadmin改过表的存储结构。以为改成InnoDB了,没想到phpMyAdmin没有改成功,谢谢fantasyni的回复,让我坚定了代码没有问题的判断,又查了一遍数据库设置。以后还是用命令行修改数据库靠谱!
@luoliangle 恩,代码确实没啥问题,不过有待改进,这样写并不是最佳实践。^_^
@fantasyni 我搜了bearcat-dao看了下,英文太差,没搞明白,bearcat-dao是跟什么东西?方便扫盲下不?
@luoliangle 就是node.js 的 O/R mapping dao 框架啊,类似于java里面的hibernate,mybatis
@luoliangle 建议看 bearcat-dao 应用的例子来了解下 bearcat-todo