mvorisek Asked: 2016-02-10 05:40:14 +0800 CST2016-02-10 05:40:14 +0800 CST 2016-02-10 05:40:14 +0800 CST 事务标识符 - MySQL 可能吗? 772 我有相当复杂的代码,一开始就开始交易。之后执行几个用户查询(或多或少不受我的控制),最后如果一切正常,事务就会提交。 我需要检测最后的连接是否仍在同一个事务中,因为用户代码可以查询提交/回滚并启动新事务。 这方面的行业惯例是什么?MySQL 数据库可以返回一些交易票证/ID 吗?还是 MySQL 仅存储事务变量,在提交/回滚后可以检测到? mysql mysql-5.6 2 个回答 Voted Vlad Mihalcea 2019-01-17T12:13:35+08:002019-01-17T12:13:35+08:00 MySQL 数据库可以返回一些交易票证/ID 吗?还是 MySQL 仅存储事务变量,在提交/回滚后可以检测到? 使用 MySQL 或 MariaDB 时,可以执行以下 SQL 查询来获取当前事务 id: SELECT tx.trx_id FROM information_schema.innodb_trx tx WHERE tx.trx_mysql_thread_id = connection_id() information_schema 目录中的innodb_trx视图提供有关当前正在运行的数据库事务的信息。由于我们的系统中可以运行多个事务,因此我们需要通过将会话或数据库连接标识符与当前正在运行的会话匹配来过滤事务行。 请注意,从 MySQL 5.6 开始,只有读写事务才会获得事务标识符。 因为分配事务 id 具有给定的开销,所以只读事务会跳过此过程。这种只读事务优化在 MariaDB 中的工作方式相同,这意味着事务 id 仅分配给读写事务。 有关更多详细信息,请查看这篇文章。 Best Answer Rick James 2016-02-12T21:46:19+08:002016-02-12T21:46:19+08:00 我怀疑是否有交易ID。但这里有一些“好的做法”: 关闭自动重新连接。(这是建立连接时某些 API 上的参数。)断开连接会终止事务并将它们回滚。关闭自动重新连接后,无论接下来发生什么,您都会收到错误消息。 在SQL语句之后检查错误。 避免意大利面条式代码。安排代码,这样很明显没有办法偷偷溜出去做COMMITor ROLLBACK。我喜欢START TRANSACTION在子程序的开头加上COMMITandROLLBACK在结尾处。然后确保它调用的任何子例程都假定它们在事务中。 这可能会帮助您发现您是否在连接中启动了另一个事务: SHOW SESSION STATUS LIKE 'Com_begin'; 或者 SELECT Variable_Value FROM information_schema.SESSION_STATUS WHERE Variable_name = 'Com_begin'; BEGIN在执行or之后立即收集它START TRANSACTION;在你之前再次收集它COMMIT,看看它是否已经改变。(“已更改”== 出了点问题。)注意:我使用的是SESSION,而不是GLOBAL.
使用 MySQL 或 MariaDB 时,可以执行以下 SQL 查询来获取当前事务 id:
information_schema 目录中的
innodb_trx
视图提供有关当前正在运行的数据库事务的信息。由于我们的系统中可以运行多个事务,因此我们需要通过将会话或数据库连接标识符与当前正在运行的会话匹配来过滤事务行。请注意,从 MySQL 5.6 开始,只有读写事务才会获得事务标识符。
因为分配事务 id 具有给定的开销,所以只读事务会跳过此过程。这种只读事务优化在 MariaDB 中的工作方式相同,这意味着事务 id 仅分配给读写事务。
有关更多详细信息,请查看这篇文章。
我怀疑是否有交易ID。但这里有一些“好的做法”:
关闭自动重新连接。(这是建立连接时某些 API 上的参数。)断开连接会终止事务并将它们回滚。关闭自动重新连接后,无论接下来发生什么,您都会收到错误消息。
在SQL语句之后检查错误。
避免意大利面条式代码。安排代码,这样很明显没有办法偷偷溜出去做
COMMIT
orROLLBACK
。我喜欢START TRANSACTION
在子程序的开头加上COMMIT
andROLLBACK
在结尾处。然后确保它调用的任何子例程都假定它们在事务中。这可能会帮助您发现您是否在连接中启动了另一个事务:
或者
BEGIN
在执行or之后立即收集它START TRANSACTION
;在你之前再次收集它COMMIT
,看看它是否已经改变。(“已更改”== 出了点问题。)注意:我使用的是SESSION
,而不是GLOBAL
.