一朽肥、安裝相關(guān)包
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= // 必填 數(shù)據(jù)庫名
二窖式、事務(wù)和鎖 transaction()
事務(wù)處理的異步函數(shù)
let { run, begin, rollback, commit, locks } = await mysql.transaction()
參數(shù) | 類型 | 必填 | 說明 |
---|---|---|---|
begin | Function | 是 | 事務(wù)開始函數(shù) |
commit | Function | 是 | 事務(wù)提交函數(shù) |
rollback | Function | 否 | 回滾事務(wù)函數(shù) |
run | Function | 是 | 執(zhí)行sql語句函數(shù) |
locks | Object | 否 | 上鎖類型 |
locks詳情
field | value | 說明 |
---|---|---|
shared_locks | ' lock in share mode' | 共享鎖 Shared Locks (簡稱 S 鎖竖共,屬于行鎖) |
exclusive_locks | ' for update' | 排他鎖 Exclusive Locks(簡稱 X 鎖苗胀,屬于行鎖) |
begin()
為事務(wù)開啟函數(shù)狡刘,在begin()
函數(shù)里面執(zhí)行數(shù)據(jù)庫操作享潜,通過run()
來執(zhí)行各個sql語句,并返回結(jié)果嗅蔬。當(dāng)執(zhí)行報錯剑按,或執(zhí)行的sql結(jié)果不滿足條件時,可以用rollback()
函數(shù)進行回滾操作澜术。當(dāng)執(zhí)行沒問題時艺蝴,記得提交事務(wù),即執(zhí)行commit()
函數(shù)鸟废。
如果需要類似秒殺活動那種業(yè)務(wù)猜敢。那么,還需要對數(shù)據(jù)進行加鎖盒延,直接在返回sql語句
后面缩擂,加上locks
對應(yīng)的類型即可。
示例代碼:
import {mysql} from 'access-db'
/** mysql 的事務(wù) 和 鎖 */
let {run, begin, rollback, commit, locks} = await mysql.transaction()
await begin(async () => {
try{
// 需要加鎖的時候添寺,就直接在返回的sql語句后面加上相應(yīng)的鎖胯盯,注意要將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() //回滾事務(wù)
}
await run(sql2)
await run(sql3)
await commit() //提交事務(wù)
}catch(err){
await rollback() //回滾事務(wù)
throw new Error(err)
}
})