Mysql 开始…结束vs开始事务…提交

Mysql 开始…结束vs开始事务…提交,mysql,Mysql,这样做的区别是什么: START TRANSACTION ... COMMIT 或做: BEGIN ... END 后面的自动提交,或者是使用另一个的实际例子吗?在MySQL 5.7和MySQL 8中,开始和结束与T-SQL中相同,表示一个“复合语句”,也称为“代码块”,就像C、Java、C#中的花括号一样 MySQL 5.7: MySQL 8.0: ,它们的语义取决于它们是否在存储程序中使用: 在所有存储程序(存储过程和函数、触发器和事件)中,解析器将BEGIN[WORK]视为BEGI

这样做的区别是什么:

START TRANSACTION
...
COMMIT
或做:

BEGIN
...
END

后面的自动提交,或者是使用另一个的实际例子吗?

在MySQL 5.7和MySQL 8中,
开始和
结束
与T-SQL中相同,表示一个“复合语句”,也称为“代码块”,就像C、Java、C#中的花括号一样

  • MySQL 5.7:
  • MySQL 8.0:
,它们的语义取决于它们是否在存储程序中使用:

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

因此:

  • 启动交易
    • 始终启动事务。您应该更喜欢这种语法
  • 开始
    • 如果在存储过程、函数、触发器或事件中,则
      BEGIN
      本身会标记复合语句的开始。您只能使用
      START TRANSACTION
      启动事务
    • 如果您直接对MySQL执行SQL,那么这也会启动一个事务(因为它被解释为
      开始工作
      )。但是这样使用它是愚蠢和混乱的,所以要避免它
  • 开始工作
    • 这是
      启动事务的别名。我会完全避免使用这个来避免混淆

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

  • MySQL 5.7:
  • MySQL 8.0:
,它们的语义取决于它们是否在存储程序中使用:

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

因此:

  • 启动交易
    • 始终启动事务。您应该更喜欢这种语法
  • 开始
    • 如果在存储过程、函数、触发器或事件中,则
      BEGIN
      本身会标记复合语句的开始。您只能使用
      START TRANSACTION
      启动事务
    • 如果您直接对MySQL执行SQL,那么这也会启动一个事务(因为它被解释为
      开始工作
      )。但是这样使用它是愚蠢和混乱的,所以要避免它
  • 开始工作
    • 这是
      启动事务的别名。我会完全避免使用这个来避免混淆

您使用的是什么版本的MySQL?版本是….5.7您使用的是什么版本的MySQL?版本是….5.7感谢您的精彩解释。不过,我必须承认我还是有点困惑!在mysql8.0中似乎有使用
begin…end
的真正用法?但是对于mysql5.7,当我需要这样的东西时,我也可以省去它,使用start/end transation,对吗?@David542据我所知,5.7和8.0中的语法和语义都是相同的(当我开始写我的答案时,我认为5.7和8.0之间的情况有所不同,但现在(在阅读了他们所有的文档之后)我认为5.7和8.0之间的行为没有任何区别。那么,有没有可能让
开始…开始事务…提交…结束…
?。我的意思是在
开始…结束
中有一个事务。谢谢你的解释。尽管如此,我必须承认我对它仍然有点困惑!似乎有一个错误在mysql8.0中使用
begin…end
的所有用法?但是对于mysql5.7,当我需要类似的东西时,我可以省略它,使用start/end transaction,对吗?@David542据我所知,5.7和8.0中的语法和语义都是相同的(当我开始写我的答案时,我认为5.7和8.0之间的情况有所不同,但现在(在阅读了他们的所有文档之后)我认为5.7和8.0之间的行为没有任何区别。那么,有没有可能让
开始…开始事务…提交…结束…
?。我的意思是在
开始…结束中有一个事务