mysql2/promise:INSERT 语句在事务查询中无效

Sho*_*rge 5 mysql node.js node-mysql2

谢谢你的时间。我在使用 mysql2/promise 包创建事务查询时遇到问题。

这是查询:

    await db.execute(`START TRANSACTION`);
    await db.execute(`INSERT INTO user VALUES (?, ?, ?, ?, ?, ?)`, [...userDetails]);
    await db.execute(`INSERT INTO account VALUES (?, ?, ?, ?, ?, ?)`, [...accountDetails]);
    await db.execute(`COMMIT`);
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Error: This command is not supported in the prepared statement protocol yet
code: 'ER_UNSUPPORTED_PS',
  errno: 1295,
  sql: 'START TRANSACTION',
  sqlState: 'HY000',
  sqlMessage: 'This command is not supported in the prepared statement protocol yet'
Run Code Online (Sandbox Code Playgroud)

我想知道是否与我的查询有关?我相信 INSERT 语句在事务块中应该完全没问题。我还尝试将每个查询组合成一个字符串,但这似乎也不起作用。

Sch*_*ern 7

MySQL限制哪些语句可以在准备好的语句中完成,start transaction是不允许的。请参阅准备好的语句中允许的 SQL 语法,这里有一个演示

execute始终使用和缓存准备好的语句。如果查询很复杂(MySQL 不必每次都解析它)或需要参数(为了安全),这很好。

但是,如果您的查询很简单并且不带任何参数,则无需准备它。使用query它只运行 SQL。这既可以避免您遇到的错误,也可以避免填满准备好的语句缓存

    await db.query(`START TRANSACTION`);
    await db.execute(`INSERT INTO user VALUES (?, ?, ?, ?, ?, ?)`, [...userDetails]);
    await db.execute(`INSERT INTO account VALUES (?, ?, ?, ?, ?, ?)`, [...accountDetails]);
    await db.query(`COMMIT`);
Run Code Online (Sandbox Code Playgroud)