美文网首页
Node.js mysql 事务和锁的写法

Node.js mysql 事务和锁的写法

作者: Fairy_zhao | 来源:发表于2021-07-08 14:29 被阅读0次

    一、安装相关包

    npm install access-db
    npm install dotenv

    然后在项目入口文件(如app.js)的最前面引入require('dotenv').config()
    新建.env文件,并添加mysql配置。

      MYSQL_HOST=localhost   // 必填
      MYSQL_USER=root
      MYSQL_PASSWORD=123456
      MYSQL_PORT=3306
      MYSQL_DATABASE=    // 必填  数据库名
    

    二、事务和锁 transaction()

    事务处理的异步函数

    let { run, begin, rollback, commit, locks } = await mysql.transaction()

    参数 类型 必填 说明
    begin Function 事务开始函数
    commit Function 事务提交函数
    rollback Function 回滚事务函数
    run Function 执行sql语句函数
    locks Object 上锁类型

    locks详情

    field value 说明
    shared_locks ' lock in share mode' 共享锁 Shared Locks (简称 S 锁,属于行锁)
    exclusive_locks ' for update' 排他锁 Exclusive Locks(简称 X 锁,属于行锁)

    begin()为事务开启函数,在begin()函数里面执行数据库操作,通过run()来执行各个sql语句,并返回结果。当执行报错,或执行的sql结果不满足条件时,可以用rollback()函数进行回滚操作。当执行没问题时,记得提交事务,即执行commit()函数。

    如果需要类似秒杀活动那种业务。那么,还需要对数据进行加锁,直接在返回sql语句后面,加上locks对应的类型即可。

    示例代码:

    import {mysql} from 'access-db'
    
    /** mysql 的事务 和 锁 */
    let {run, begin, rollback, commit, locks} = await mysql.transaction()
    
    await begin(async () => {
      try{
        // 需要加锁的时候,就直接在返回的sql语句后面加上相应的锁,注意要将await括起来
        let sql1 = (await mysql.get('user', 10, 'sentence')) + locks.exclusive_locks
        let sql2 = await mysql.update('user', 10, {money: ['incr', -3]}, 'sentence')
        let sql3 = await mysql.update('user', 12, {money: ['incr', 3]}, 'sentence')
    
        let res1 = await run(sql1)
        if(res1.data.money < 3){
          return await rollback()  //回滚事务
        }
        await run(sql2)
        await run(sql3)
        await commit()  //提交事务
      }catch(err){
        await rollback()  //回滚事务
        throw new Error(err)
      }
    })
    

    相关文章

      网友评论

          本文标题:Node.js mysql 事务和锁的写法

          本文链接:https://www.haomeiwen.com/subject/fqctpltx.html