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

时间:2010-02-17 12:21:21

标签: mysql client autocommit

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

有没有办法在Linux命令行上运行mysql时设置autocommit = 0(无需每次都输入)?

7 个答案:

答案 0 :(得分:25)

也许最好的方法是编写一个启动mysql命令行客户端的脚本,然后在将控件交给你之前自动运行你想要的任何sql。

linux附带了一个名为'expect'的应用程序。它以一种模仿你的击键的方式与外壳相互作用。它可以设置为启动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

DC

期待由Michael Hinds提供的脚本

spawn /usr/local/mysql/bin/mysql 
expect "mysql>" 
send "set autocommit=0;\r" 
expect "mysql>" interact

期望非常强大,可以让生活变得更加轻松,就像在这种情况下一样。

如果你想让脚本运行而不调用expect,请使用shebang line

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

#! /usr/bin/expect

然后使用..

更改脚本的权限
chmod 0744 myscript

然后调用脚本

./myscript

DC

答案 1 :(得分:20)

您可以通过3种不同方式执行此操作:

  1. 在执行INSERT之前,请始终发出BEGIN;声明。这将关闭自动提交。一旦您希望将数据保存在数据库中,就需要COMMIT;

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

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

答案 2 :(得分:9)

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

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

答案 3 :(得分:4)

你的意思是mysql文本控制台?然后:

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

我推荐的是什么。

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

init_connect='set autocommit=0'

这会为每个客户端设置autocommit

答案 4 :(得分:2)

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

select @@autocommit;

答案 5 :(得分:1)

对于自动提交,请确保使用以下命令。在my.cnf文件中设置:

    [mysqld]
    autocommit=0

答案 6 :(得分:0)

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

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

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

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

有关这些参数的详细信息,请参阅reference of mysqldump