Skip to content

事务

Exec Transaction DTS

提示

查询语句及数据变更语句类型描述具体详情请参考各详情文档描述

ts
interface TransactionChange<T, ResultSetHeader> {
  /**
   * 执行数据插入语句
   *
   * Execute the data insert statement
   */
  insert(v: InsertParam): Promise<ResultSetHeader>
  /**
   * 执行数据批量更新语句
   *
   * Execute data batch update statements
   */
  batchUpdate(v: T): Promise<ResultSetHeader>
  /**
   * 执行数据删除语句
   *
   * Execute a data delete statement
   */
  delete(v: DeleteParam): Promise<ResultSetHeader>
  /**
   * 执行数据更新语句
   *
   * Execute the data update statement
   */
  update(v: UpdateParam): Promise<ResultSetHeader>
}
/**
 * 事务参数配置
 */
interface TransactionParams<T, ResultSetHeader> {
  /**
   * 执行原SQL语句
   *
   * Execute query statement
   * @param param 参数值
   * @returns
   */
  sql(sql: string, param?: VALUE_TYPE): Promise<QueryResult>
  /**
   * 执行查询语句
   *
   * Execute query statement
   * @param v 配置参数信息
   * @returns
   */
  query(v: ExecQueryParam): Promise<Record<string, any>[]>
  /**
   * 执行查询数据详情语句
   *
   * Execute the statement to query data details
   * @param v 参数信息
   */
  detail(v: ExecQueryBaseParam): Promise<Record<string, any> | undefined>
  /**
   * 获取数据总数
   * @param v 参数信息
   */
  count(v: QueryCountParam): Promise<number>
  /**
   * 数据更新函数
   */
  change: TransactionChange<BatchUpdateParam<T>, ResultSetHeader>
}

Example

ts
import emysql, { DefineTable } from '@aicblock/emysql' // 引用库

// 数据库实例化
const mysql = new emysql({
  password: '[db登录密码]',
  user: '[db登录用户名]',
  database: '访问数据库名称'
})

await mysql.init()

// 定义表结构
const t_user = DefineTable({
  tableName: 't_user',
  columns: [
    {
      name: 'id',
      dataType: 'INT',
      primaryKey: true,
      autoIncrement: true,
      comments: '主键id'
    },
    {
      name: 'name',
      dataType: 'VARCHAR',
      length: 45,
      notNull: true,
      comments: '名称'
    },
    {
      name: 'age',
      dataType: 'INT',
      notNull: true,
      comments: '年龄'
    }
  ]
})

await mysql.table.create([t_user])

// t_user 数据
const user = [
  { name: 'name1', age: 20, id: 1 },
  { name: 'name2', age: 21, id: 2 },
  { name: 'name3', age: 30, id: 3 },
  { name: 'name4', age: 31, id: 4 },
  { name: 'name5', age: 18, id: 5 }
]

await mysql.change.insert({
  t: t_user,
  params: user
})

// 更新失败回滚
await mysql.transaction(async (v) => {
  try {
    await v.change.update({
      t: t_user,
      condition: { id: 1 },
      params: { name: 'name1_update', age: 22 }
    })
    throw Error('STOP UPDATE')
  } catch (error) {
    return Promise.reject(error)
  }
})
await mysql.detail({
  t: t_user,
  condition: { id: 1 }
})
// result:: { name: 'name1', age: 20, id: 1 }