Node.js mysql 事务和锁的写法

Posted wzj5cnaz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js mysql 事务和锁的写法相关的知识,希望对你有一定的参考价值。

一、安装相关包

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()
参数类型必填说明
beginFunction事务开始函数
commitFunction事务提交函数
rollbackFunction回滚事务函数
runFunction执行sql语句函数
locksObject上锁类型

locks详情

fieldvalue说明
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 事务和锁的写法的主要内容,如果未能解决你的问题,请参考以下文章

一文详解-MySQL 事务和锁

RDB | MySQL的事务隔离级别和锁的机制

Mysql数据库事务的隔离级别和锁的实现原理分析

MySql的隔离级别和锁的关系

如何优雅地回答 MySQL 的事务隔离级别和锁的机制?

高频 | MySQL 事务隔离级别和锁的机制可以这么答