【问题标题】:How to timeout a mysql++ query in c++如何在 C++ 中超时 mysql++ 查询
【发布时间】:2008-09-17 10:02:24
【问题描述】:

我正在使用 mysql++ 连接到 MySQL 数据库以执行一堆数据查询。由于我正在读取的表不断被写入,并且我需要一致的数据视图,我首先锁定表。但是,MySQL 在其锁定查询中没有“NOWAIT”的概念,因此如果表被其他东西锁定了很长时间,我的应用程序就会坐在那里等待。我想要它做的是能够返回并说“无法获得锁定”之类的内容,然后在几秒钟内重试。我对这个超时的一般尝试如下。

如果我在将表锁定在数据库后运行它,我会收到超时已命中的消息,但我不知道如何让 mysql_query 行终止。如有任何帮助/想法,我将不胜感激!


volatile sig_atomic_t success = 1;

void catch_alarm(int sig) {
        cout << "Timeout reached" << endl;
        success = 0;
        signal(sig,catch_alarm);
}

// connect to db etc.
// *SNIP

signal (SIGALRM, catch_alarm);
alarm(2);
mysql_query(p_connection,"LOCK TABLES XYZ as write");

【问题讨论】:

    标签: c++ mysql


    【解决方案1】:

    您可以通过这种方式实现“类似取消”的行为:

    您在单独的线程上执行查询,无论是否发生超时,该线程都会继续运行。超时发生在主线程上,并将变量设置为“1”,标记它发生了。然后你在你的主线程上做任何你想做的事情。

    查询线程在查询完成后检查是否发生超时。如果没有,它会做它需要做的其余工作。如果它有,它只是解锁它刚刚锁定的表。

    我知道这听起来有点浪费,但是锁定-解锁周期应该基本上是瞬时的,并且尽可能接近你想要的结果。

    【讨论】:

      【解决方案2】:

      您可以在不同的线程中执行阻塞查询,而不必担心超时。当一些数据到达时,您通知需要了解事务状态的线程。

      【讨论】:

        【解决方案3】:

        如果我从头开始编写,我会这样做,但这是一个服务器应用程序,我们只是对其进行升级而不是大规模返工。

        【讨论】:

          【解决方案4】:

          与其尝试使用表锁来伪造事务,为什么不切换到获得实际事务的 innodb 表?只需确保将默认事务隔离级别设置为 REPEATABLE READ。

          【讨论】:

            【解决方案5】:

            正如我所说,当这是一个实时的生产系统时,“切换”或重新架构并不是那么容易。 MySQL 没有提供检查锁或选择不挂起等待锁的方法,这让我有点沮丧。

            【讨论】:

              【解决方案6】:

              我不知道这在资源使用和“最佳实践”和“清洁度”等方面是否是个好主意……但你现在已经反复描述了束缚你的手铐- 构建一个“干净”的系统......所以这里......

              你能打开一个新的、单独的连接来发送 LOCK 语句吗?然后在您捕获超时警报时关闭该连接?通过关闭/销毁专用于 LOCK 语句的连接,这不会本质上“取消” LOCK 语句吗?我不确定是否会像我所描述/猜测的那样发生此类事件,但也许需要测试一下。

              【讨论】:

                【解决方案7】:

                到目前为止,我所描述的经验表明,关闭正在运行查询的连接会导致段错误。因此,将该查询分派到不同的连接并没有真正的帮助,因为这也会出现段错误。

                【讨论】:

                  猜你喜欢
                  • 2011-01-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-05-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-25
                  相关资源
                  最近更新 更多