如何为MySQL客户端关闭自动提交?

40

我有一个网络应用程序,假定数据库上已启用autocommit,因此我不想在那里进行任何更改。但是,我找到的所有文档似乎只谈论在数据库上使用init_connect,即所有客户端连接的全局设置。

是否有一种方法可以仅在 Linux 命令行上运行 mysql 时设置 autocommit=0 (而无需每次键入)?


1
这个工作了吗:init_connect='set autocommit=0' - Haim Evgi
1
不,那是mysqld的参数或命令行参数。我说的是mysql客户端,它会给出错误提示“mysql: unknown variable 'init_connect=set autocommit=0'”。 - Michael Hinds
8个回答

30
也许最好的方法是编写一个脚本,启动mysql命令行客户端,然后自动运行你想要的任何SQL语句,然后将控制权交给你。
Linux带有一个名为“expect”的应用程序。它与Shell交互,以模拟您的按键操作。可以设置为启动mysql,等待您输入密码,运行进一步的命令,例如SET autocommit = 0;,然后进入交互模式,以便您可以运行任何命令。
关于命令SET autocommit = 0;的更多信息,请参见.. http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html 我使用expect登录到命令行实用程序,在我的情况下它会启动ssh,连接到远程服务器,启动应用程序,输入我的用户名和密码,然后将控制权交给我。这样可以节省大量的打字时间 :) http://linux.die.net/man/1/expect Michael Hinds提供的Expect脚本
spawn /usr/local/mysql/bin/mysql 
expect "mysql>" 
send "set autocommit=0;\r" 
expect "mysql>" interact

Expect非常强大,可以在这种情况下使生活变得更加轻松。

如果你想让脚本在不调用expect的情况下运行,请使用shebang行将其插入到你的脚本中(提示:使用which expect查找您的expect可执行文件的位置)。

#! /usr/bin/expect

然后使用以下命令更改脚本的权限..

chmod 0744 myscript

然后调用脚本

./myscript

华盛顿特区


太好了,干杯!我已经配置了MySQL的默认用户名、密码等,所以不需要传递这些信息。尽管meta说可以格式化代码,但我似乎无法做到,所以请随意将其添加到主要响应中。我的expect脚本如下:spawn /usr/local/mysql/bin/mysql expect "mysql>" send "set autocommit=0;\r" expect "mysql>" interact - Michael Hinds
谢谢 - 如果您所说的“格式化代码”是指在注释中,那么不,没有可用的格式化。我会将您的代码添加到答案中。 - DeveloperChris

28

您可以通过以下三种方式来实现:

  1. 在执行 INSERT 操作之前,始终使用 BEGIN; 语句。这将关闭自动提交功能。一旦您希望将数据持久化到数据库中,则需要执行 COMMIT; 语句。

  2. 每次实例化数据库连接时,都需要使用 autocommit=0;

  3. 对于全局设置,可以在 MySQL 的 my.cnf 配置文件中添加 autocommit=0 变量。


autocommit=0 in ~/.my.cnf does not work with mysql-5.7.33, I get the following error: mysql: [ERROR] unknown variable 'autocommit=0' - mariusm
2
init-command='set autocommit=0' 的作用与另一个答案中描述的一样。 - mariusm

15

看起来你可以将它添加到你的 ~/.my.cnf 文件中,但是需要作为初始化命令标志(init-command flag)的一个参数添加到 [client] 部分中,像这样:

[client]
init-command='set autocommit=0'

期望的方法也可以,这只是更干净的方式。顺便说一下,这是针对mysql 5.5的,不确定它是否适用于早期版本。 - rascalking
通过在 /etc/my.cnf 中添加内容,这对我在运行于 Ubuntu 14.4 上的 MySQL 5.5 上起作用。 - Dave Lyndon
2
我建议将此设置添加到[mysql]部分。如果在[client]中使用_mysqldump_时出现未知变量错误,则需要进行测试。已在MySQL 5.6上进行了测试。 - Svilen

6

这对于检查自动提交的状态非常有用;

select @@autocommit;

1
你可以使用以下命令更改状态:set @@autocommit=0; - Farzan.S

5

您是指mysql文本控制台吗?那么:

START TRANSACTION;
  ...
  your queries.
  ...
COMMIT;

我建议这样做。

如果你想避免每次运行此类查询时都要输入这些内容,可以将以下内容添加到my.cnf文件的[mysqld]部分。

init_connect='set autocommit=0'

这将会对每个客户端关闭autocommit

那不会关闭自动提交,我想要的是一些东西,即使在每个会话中也不必输入,更不用说每个 DML 语句了。 - Michael Hinds
抱歉,我应该更仔细地阅读您的帖子。据我所知,autocommit不是可以作为init connect参数传递的东西 - 这是因为它是一个全局变量。正如您所知,全局变量只能由超级用户设置。现在陷入了进退两难的境地:超级用户不允许使用init_connect设置相关页面的手册在这里:http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html(向下滚动直到您到达--init-connect部分)。 - e4c5
@e4c5 我正好在找这个。谢谢。 - codeMan

3

如果要关闭自动提交,请确保使用以下命令。在my.cnf文件中设置如下:

    [mysqld]
    autocommit=0

0

在恢复时手动关闭自动提交,不如以包含所有必要语句的方式将MySQL数据转储到SQL文件中。

mysqldump的命令行参数是--no-autocommit。您还可以考虑添加--opt,它设置了其他参数的组合,以加快恢复操作。

以下是我使用的完整mysqldump命令行示例,包含--no-autocommit--opt

mysqldump -hlocalhost -uMyUser -p'MyPassword' --no-autocommit --opt --default-character-set=utf8 --quote-names  MyDbName  >  dump.sql

有关这些参数的详细信息,请参阅mysqldump参考文档


0

MySQL中自动提交变量的默认值为1; 要查看MySQL中autocommit的当前值,请使用以下命令 mysql> select @@autocommit; 如果您想关闭autocommit,请使用以下命令 mysql> set autocommit = 0;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接