Mysql 当Golang程序在进行数据库事务时终止时,它是否可以回滚?

Mysql 当Golang程序在进行数据库事务时终止时,它是否可以回滚?,mysql,go,transactions,Mysql,Go,Transactions,假设MariaDB兼容的数据库AWS Aurora RDS具有默认设置,其中包括启用自动提交,如果Lambda函数在执行一个超过5秒的事务后3秒终止,例如 人们会认为结果是什么?交易不会被提交吗 我使用的是Go MySQL驱动程序v1.3.0-84-g6be42e0 btw。我还做了一个测试,但我不知道它是否正确,因为我不明白事务SQL是如何提交的。如果您使用InnoDB表,我认为a会发生什么,请阅读以下内容: 当连接关闭时,将回滚当前的正常事务(如果有) 这与Go客户机、Java客户机、PHP

假设MariaDB兼容的数据库AWS Aurora RDS具有默认设置,其中包括启用自动提交,如果Lambda函数在执行一个超过5秒的事务后3秒终止,例如

人们会认为结果是什么?交易不会被提交吗


我使用的是Go MySQL驱动程序v1.3.0-84-g6be42e0 btw。我还做了一个测试,但我不知道它是否正确,因为我不明白事务SQL是如何提交的。如果您使用InnoDB表,我认为a会发生什么,请阅读以下内容:

当连接关闭时,将回滚当前的正常事务(如果有)

这与Go客户机、Java客户机、PHP客户机或任何其他客户机的工作原理相同


如果使用MyISAM表,则不会回滚。如果当前正在执行SQL更新,它可能会更新某些行的子集,而保持其余行不变。您将得到一个状态不一致的表。非事务表不存在ACID行为。这就是为什么您不应该使用MyISAM。

只有在您没有明确启动事务时,才会考虑自动提交。一旦使用BEGIN,那么提交它的唯一方法就是在显式提交之后。一旦事务正在进行且连接已关闭,服务器将自动回滚。好的,一旦提交运行,事务将运行,包括5.5s睡眠。如果在3s后终止,它将如何回滚?它应该回滚吗?如果提交返回时没有错误-它已提交。它将回滚,但不会从go开始回滚-mysql服务器将看到连接丢失/超过超时,并在很短的时间内自动回滚它?Aurora不支持MyISAM,尽管它很有趣!很好,Aurora不支持MyISAM。注意,如果Go程序在发送“提交”和接收/处理响应之间退出,那么事务仍有可能完成。没有任何方法可以避免这种情况,因此最好使事务尽可能幂等或可恢复。@Flimzy但是,在收到“提交”后,事务应由RDBMS独立提交,无论客户端是否仍然连接,不是吗?如果是:按计划@马库斯马尔伯格:是的,但你不能指望你的客户会得到这样的信息。这在某些情况下无关紧要,但在另一些情况下则会。
  tx, err := h.db.Begin()
  if err != nil {
      log.WithError(err).Error("failed to start transaction")
  }
  res, execErr := tx.Exec(fmt.Sprintf("UPDATE testtable SET val = %d WHERE id = 1; SELECT SLEEP(5.5);", time.Now().Unix()))
  if execErr != nil {
      log.WithError(err).Error("rolling back")
      err = tx.Rollback()
      if err != nil {
          log.WithError(err).Error("failed to roll back")
      }
  }
  if err := tx.Commit(); err != nil {
      log.WithError(err).Error("failed to commit")
  }