【问题标题】:All or nothing / transaction statements with mysql使用mysql的全部或全部/事务语句
【发布时间】:2013-02-03 22:01:53
【问题描述】:

我在一个 shell 脚本中有以下两条语句:

 32 /usr/local/mysql/bin/mysql -u root files -e "TRUNCATE path"
 33 /usr/local/mysql/bin/mysql -u root files -e "
 34     LOAD DATA INFILE '/tmp/files.txt'
 35     INTO TABLE path
 36     FIELDS TERMINATED BY ','
 37       (size, @d2, @d3, @d4, @d5, path)
 38     SET last_modified=str_to_date(CONCAT(@d2, ',', @d3, ',', @d4, ',', @d5), '%b,%d,%T,%Y');"
 39 }

如何使从第 32 行和第 32 行开始的命令要么都工作要么都失败(事务)?

【问题讨论】:

标签: mysql bash shell


【解决方案1】:

你需要的是transaction:

BEGIN;
LOAD DATA INFILE ...;
SET ...;
COMMIT;

除非您COMMIT 事务,否则数据库不会加载这些行或更新列。

请注意,some operations cannot be "transactionalized" in MySQL,这包括架构更改以及TRUNCATE TABLE。有些语句会强制提交,无论您的意图如何,因此在尝试创建事务时要小心避免这些语句。

【讨论】:

  • 谢谢。在上面的两个命令中,我应该从哪里开始事务BEGIN
  • 我认为我的例子在这方面非常清楚。就在LOAD 操作之前。
  • 而且,对于单个语句 (LOAD INFILE),它本身不是事务性的吗?
  • LOAD DATA 操作是原子的,这意味着它将添加所有行或什么都不做,但SET 操作可以独立进行。
  • 啊,我现在看到您的SETLOAD DATA 声明的一部分。如果是这种情况,这是不寻常的,则不需要交易。单个语句通常是原子的。事务用于将几个其他原子操作组合成一个原子操作。
猜你喜欢
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2020-01-13
相关资源
最近更新 更多