java - --single-transaction --mysqldump 的lock-tables 选项- 内部发生了什么?

标签 java mysql locking

我确实找到了与此类似的其他帖子,但想要有关 mysqldump 的这些选项的一些额外信息。我知道 --single-transaction 和 --lock-tables 是互斥的操作。以下是我对这些选项的疑问。

a) 假设我选择使用 --lock-tables 选项。在这种情况下,mysqldump 获取所有表上的读锁。因此,尝试写入表的任何其他进程都将进入阻塞(等待)状态。但是如果 mysqldump 需要很长时间,正在等待的进程会继续无限期地等待吗?

例如,我尝试了这个实验 - 我有一个 Java (JDBC) 程序写入名为 MY_TEST 的 mysql 数据库表。我登录到 mysql 控制台并发出“LOCK TABLES MY_TEST READ;”手动命令。因此,Java 进程被阻塞,等待锁被释放。我的问题是,如果读锁长时间没有释放,是否会出现连接超时或任何此类问题?我等了两分钟,没有注意到任何错误,一旦使用“UNLOCK table”命令释放锁,java 进程就会正常继续。这种行为是 java mysql 驱动程序特有的吗?还是我可以期望使用 mysql 驱动程序的 C 程序也能得到同样的结果?

b) 我的第二个问题是关于 --single-transaction 选项。假设我有 10 个 InnoDB 表,其中 3 个表相互关联(使用 FK),其他表独立但仍然使用 InnoDB 引擎。单个事务是否仅适用于使用 FK 相互关联的 3 个表?或者我可以期望 7 个独立表的状态与转储 3 个相互依赖的表时的状态完全相同吗?

最佳答案

a.) 我相信答案是肯定的,在 mysql 级别,连接将无限期地等待 mysqldump 释放表锁。您可以在应用程序级别对此进行一些控制,方法是使用带有验证查询的连接池,该查询针对锁定的表进行查询,并将检索超时设置为您想要的任何值。例如,在 c3p0 中这很容易做到。但是,在没有其他信息的情况下,我不会推荐这种方法;看起来很笨拙。我没有使用过 mysql C 驱动程序,所以我不能肯定,但我会假设与 Java 类似的行为。所有这些就是为什么 mysqldump 对于具有大量数据和 Activity 的系统的实时备份来说不是一个好的选择。

b.所有转储的表都将作为单个事务的一部分转储,从而为参与转储的所有表生成一致的快照。主外键关系不会对事务产生影响。使用单事务是热备份的可行选择。

关于java - --single-transaction --mysqldump 的lock-tables 选项- 内部发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1513179/

相关文章:

java BufferedReader 回滚到上一行

mysql - 如果主从具有不同的数据库以防Mysql复制,如何重新同步Mysql DB?

c# - 当多个进程正在使用它时如何写入一个txt文件? C#

java - 我可以将 java.util.concurrent.locks.Lock 更改为 java.util.concurrent.locks.ReentrantReadWriteLock;

mysql - MySQL InnoDB 下一键锁定中唯一索引和非唯一索引之间差异背后的基本原理

java - 获取 Java 中的通用列表 <?> 对象的值

java - 按钮 onClick() 导致强制停止

java - Android HandlerThread 在没有 UiHandler 的情况下更新 UI

python - 如何使用线程模块调用函数?

mysql - 通过分割字段连接表