【问题标题】:BEGIN...END vs START TRANSACTION...COMMIT开始...结束与开始交易...提交
【发布时间】:2020-06-27 19:44:16
【问题描述】:

做有什么区别:

START TRANSACTION
...
COMMIT

或者在做:

BEGIN
...
END

以后是否自动提交,或者可能是使用其中一个的实际示例?

【问题讨论】:

  • 你用的是什么版本的 MySQL?
  • 版本是....5.7

标签: mysql


【解决方案1】:

在 MySQL 5.7 和 MySQL 8 中,BEGINEND 与 T-SQL 中的相同,表示“复合语句”也称为“代码块”,就像 C 中的花括号、Java、C#等。

However, the BEGIN keyword is also (confusingly) overloaded as an alias for BEGIN WORK and START TRANSACTION,它们的语义取决于它们是否在存储程序中使用:

在所有存储程序(存储过程和函数、触发器和事件)中,解析器将BEGIN [WORK] 视为BEGIN ... END 块的开始。在此上下文中使用 START TRANSACTION 开始事务。

所以:

  • START TRANSACTION
    • 始终启动事务。您应该更喜欢这种语法。
  • BEGIN:
    • 如果您在存储过程、函数、触发器或事件中,那么BEGIN 本身就标志着复合语句的开始。您只能使用START TRANSACTION 开始交易。
    • 如果您直接对 MySQL 执行 SQL,那么这也会启动一个事务(因为它被解释为 BEGIN WORK)。但是以这种方式使用它既愚蠢又令人困惑,因此请避免使用它。
  • BEGIN WORK:
    • 这是START TRANSACTION 的别名。我会完全避免使用它以防止混淆。

【讨论】:

  • 感谢您的精彩解释。不过,我必须承认我还是有点困惑!在mysql8.0中使用begin...end似乎有真正的用途?但是对于 mysql5.7,我也可以将其排除在外,并在需要类似的东西时使用开始/结束转换,对吗?
  • @David542 据我所知,5.7 和 8.0 的语法和语义是相同的(当我开始写答案时,我认为 5.7 和 8.0 之间的情况有所不同,但现在(在阅读他们所有的文档)我认为 5.7 和 8.0 之间的行为没有任何区别。
  • 那么,是否有可能拥有... BEGIN ... START TRANSACTION ... COMMIT ... END... ?我的意思是在BEGIN ...END 内进行交易
猜你喜欢
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 2011-01-04
相关资源
最近更新 更多