账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    node.js中Sequelize的事务失败回滚日志正常,但是数据库还是插入记录了
    68
    0
    其实事务这块都没问题,model里面封装的问题,现在已经解决了。谢谢各位回复官方手动提交事务的结果,效果并没有改变,很多写法都尝试了一边,最后都是第一条记录插入成功,没有回滚和日志不一样日志看到有回滚动作,但是数据库还有插入第一条数据修改异步的写法,结果一样,如数据库成功插入数据companys,
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 爱していゐ 普通会员 1楼

      在Node.js中,Sequelize是一个关系型数据库模型库,它提供了一种方便的方式来操作SQL(Structured Query Language)和模型。如果在Node.js中使用Sequelize进行事务,事务失败后, Sequelize会返回一个事务日志对象,其中包含执行时的相关信息,如操作ID、执行失败的原因等。但是,如果在执行事务失败时,数据库还在插入记录,这可能是因为以下几种情况:

      1. 事务是异步执行的:在Node.js中,Sequelize的事务是异步执行的,这意味着它不会立即返回事务日志,而是会等待事务提交后返回。如果在事务执行过程中插入了记录,但事务失败,数据库仍然会继续执行插入操作,导致事务回滚后,数据库还在插入记录。

      2. 多个事务在并行执行:如果在Node.js中使用了多个Sequelize事务进行数据操作,如果在事务执行过程中插入了记录,但其中一个事务失败,其他事务可能不会因为此事务而停止,而是在事务成功时继续执行插入操作,导致事务回滚后,数据库还在插入记录。

      3. 应用程序错误:如果在事务执行过程中发生了一些错误,如数据库连接失败、模型对象错误等,可能导致数据库无法插入记录,即使事务已提交,数据库仍会在插入操作后插入记录。

      要解决这个问题,你可以在事务成功时检查插入操作是否成功,如果插入操作失败,可以尝试回滚事务并重新执行插入操作。以下是一个简单的示例,假设我们有一个名为transaction的数据库连接:

      ```javascript const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql', });

      // 创建模型 const Product = sequelize.define('Product', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, }, name: { type: Sequelize.STRING, }, price: { type: Sequelize.FLOAT, }, });

      // 连接数据库 sequelize.connect((error) => { if (error) { console.error('Failed to connect to database:', error); return; }

      console.log('Connected to database successfully'); });

      // 执行插入操作 Product.create({ name: 'Product 1', price: 100.00, }, (error) => { if (error) { console.error('Failed to insert product:', error); return; }

      console.log('Product inserted successfully'); // 在这里,你可以使用已插入的Product对象进行其他操作 // ... });

      // 关闭数据库连接 sequelize.close(); ```

      在这个示例中,如果在插入操作失败,我们将抛出一个Error对象,其中包含执行时的相关信息,如操作ID、执行失败的原因等。然后,我们可以在事务成功时检查插入操作是否成功,并在成功时执行插入操作。如果插入操作失败,我们可以通过try/catch块捕获错误,并在错误处理中执行回滚事务并重新执行插入操作。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部