mysql 事务,回滚没有反应
发布于 10 年前 作者 luoliangle 7020 次浏览 最后一次编辑是 8 年前
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。请问问题出在什么地方?谢谢

7 回复

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

回到顶部