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

如何关闭MySQL客户端的自动提交?,mysql,client,autocommit,Mysql,Client,Autocommit,我有一个web应用程序,它是在数据库上打开自动提交的假设下编写的,所以我不想在那里做任何更改。然而,我所能找到的所有文档似乎只讨论在数据库上使用init_connect,即所有客户端连接的全局设置 只有在Linux命令行上运行mysql时(不必每次都输入),有没有办法设置autocommit=0?你是说mysql文本控制台吗?然后: START TRANSACTION; ... your queries. ... COMMIT; 这是我推荐的 但是,如果您希望避免每次需要运行此类查

我有一个web应用程序,它是在数据库上打开自动提交的假设下编写的,所以我不想在那里做任何更改。然而,我所能找到的所有文档似乎只讨论在数据库上使用init_connect,即所有客户端连接的全局设置


只有在Linux命令行上运行mysql时(不必每次都输入),有没有办法设置autocommit=0?你是说mysql文本控制台吗?然后:

START TRANSACTION;
  ...
  your queries.
  ...
COMMIT;
这是我推荐的

但是,如果您希望避免每次需要运行此类查询时都键入此内容,请将以下内容添加到my.cnf文件的[mysqld]部分

init_connect='set autocommit=0'

这将为每个客户端设置
autocommit

您可以通过三种不同的方式来实现:

  • 在执行
    插入之前,请始终发出
    开始语句。这将关闭自动提交。您将需要执行
    提交一旦您希望将数据持久化到数据库中

  • 使用
    autocommit=0每次实例化数据库连接时

  • 对于全局设置,在MySQL的
    my.cnf
    配置文件中添加一个
    autocommit=0
    变量


  • 也许最好的方法是编写一个脚本,启动mysql命令行客户机,然后在将控制权移交给您之前自动运行您想要的任何sql

    linux附带了一个名为“expect”的应用程序。它与shell的交互方式可以模仿您的按键。可以设置为启动mysql,等待您输入密码。运行进一步的命令,例如
    SET autocommit=0然后进入交互模式,以便您可以运行所需的任何命令

    有关命令
    SET autocommit=0的详细信息请参见

    我使用expect登录到命令行实用程序,在我的情况下,它启动ssh,连接到远程服务器,启动应用程序,输入我的用户名和密码,然后将控制权移交给我。为我节省大量的打字时间:)

    直流电

    请期待Michael Hinds提供的脚本

    spawn /usr/local/mysql/bin/mysql 
    expect "mysql>" 
    send "set autocommit=0;\r" 
    expect "mysql>" interact
    
    expect功能非常强大,可以让生活变得更加轻松

    如果希望在不调用expect的情况下运行脚本,请使用shebang行

    将其作为脚本的第一行插入(提示:使用
    whichexpect
    查找expect可执行文件的位置)

    然后使用..更改脚本的权限

    chmod 0744 myscript
    
    然后调用脚本

    ./myscript
    

    DC

    看起来您可以将其添加到~/.my.cnf中,但需要将其作为参数添加到[client]部分的init命令标志中,如下所示:

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

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

    mysqldump的命令行参数是
    --无自动提交
    。您还可以考虑添加<代码> -opt<代码>,它设置了其他参数的组合以加快恢复操作。 下面是我使用的完整mysqldump命令行的示例,其中包含
    --no autocommit
    --opt

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

    有关这些参数的详细信息,请参见

    这有助于检查自动提交的状态

    select @@autocommit;
    

    对于“自动提交关闭”,请务必使用下面的命令。在
    my.cnf
    文件中设置如下:

        [mysqld]
        autocommit=0
    

    这是否有效:init_connect='set autocommit=0'否,这是mysqld的参数或命令行参数。我说的是mysql客户端,它给出的错误“mysql:unknown variable'init_connect=set autocommit=0'”并没有关闭autocommit,而且我想要的东西即使在每个会话中都不必键入,更不用说每个DML了。对不起,我应该更仔细地阅读你的帖子。据我所知,autocommit不能作为init connect参数传递,因为它是一个全局变量。正如您所知,全局变量只能由超级用户设置。现在,第22条:超级用户不允许使用手册中的init_connect设置相关页面:(向下滚动,直到到达--init connect部分)@e4c5我正是在寻找这个。谢谢。太好了,干杯!我已经用默认用户名、密码等配置了MySQL,所以我不需要传递这些。不管meta怎么说,似乎都无法格式化代码,所以可以将其添加到主响应中。我的expect脚本是:spawn/usr/local/mysql/bin/mysql expect“mysql>”send“set autocommit=0;\r“expect”mysql>“interactionThank-如果您在评论中所说的“格式化代码”,那么没有可用的格式化。我会将您的代码添加到答案中expect方法也可以,这只是更简洁而已。顺便说一句,这是针对mysql 5.5的,不确定它是否适用于早期版本。通过添加到/etc/my.cnf,这对我在运行于Ubuntu 14.4的mysql 5.5上的工作是有效的。我建议将此设置添加到
    [mysql]
    部分。如果在
    [client]
    中,我在使用mysqldump时得到未知变量的错误。在MySQL 5.6上测试,您可以使用此命令更改状态:
    set@@autocommit=0
    autocommit=0
    ~/.my.cnf
    不适用于
    mysql-5.7.33
    ,我得到以下错误:
    mysql:[error]未知变量“autocommit=0”
    init command='set autocommit=0'
    与另一个答案中的情况相同
        [mysqld]
        autocommit=0