【问题标题】:Transaction priority?交易优先级?
【发布时间】:2015-08-30 00:28:43
【问题描述】:

我有每 3 分钟运行一次脚本的 crons,脚本包含什么功能:

try
   begin transaction
   loop
     //parse large xml data
     //send data to database
   endloop
   commit
endtry
catch
   rollback
endcatch

现在,数据插入是一个漫长的过程,大约需要3-6分钟,而cron是每3分钟,所以有时会出现进程冲突。 我看到当我在循环中添加优先级具有新进程的提交时,我可以说嘿新事务等到事务提交之前吗?

【问题讨论】:

  • 如果你无法锁定一个琐碎/专用的哨兵表,称之为 MyISAM 或 ROW (INNODB),然后退出。但是不要害怕,你可以在3分钟后重试:>
  • 是的,标记一个 cron 正在以某种方式运行,然后每次启动它都会检查它是否应该运行或只是退出。你可以简单地在磁盘上创建一个文件,或者在数据库表上设置一个列等等,你可以做很多事情来实现这一点。你甚至可以使用MUTEX
  • 聪明的想法@RiggsFolly,有没有办法检查一些交易是否活跃?
  • 你使用的是什么操作系统
  • 是web linux服务器

标签: php mysql


【解决方案1】:

我会尝试保持简单 S.....,并在现有 cron 脚本的顶部使用类似这样的简单文件锁定过程。

$fp = fopen("/tmp/my_cron_lock.txt", "r+");

if ( ! flock($fp, LOCK_EX)) {
    // other cron is overrunning so
    // I'll get restarted in 3 mins 
    // so I will let other job finish

    fclose($fp);

    exit;
}

// existing script



// free the lock, 
// although this will happen automatically when script terminates

    fclose($fp);
?>

【讨论】:

  • 你认为我写的是事务的 cron_lock 状态,如果完成比重新开始?
  • 该文件不需要包含任何内容,我们所做的只是利用它的存在性和独占分配它的能力来决定另一个这些 cron 作业是否正在运行。
  • 如果您最多只需要等待 3 分钟,则可能不需要从这里开始下一个。
【解决方案2】:

您可以在某个地方持久存储一些锁,通常是在文件系统中的某个锁文件中完成:

进程首先检查文件是否已经存在。如果是这样,它会立即退出。 如果不存在锁定文件,它会自己创建锁定文件并将自己的进程 ID 写入其中。终止时,它会再次检查它是否仍然是它自己的锁定文件(通过进程 ID),如果一切正常,则将其删除。

这样您就可以每分钟触发一次触发脚本(cron 作业)而没有任何风险。

同样可以在数据库甚至表级别进行。但是,根据情况,这可能不太可靠,因为如果数据库连接出现问题,它显然会失败。涉及的层越少,就越健壮。和往常一样:您必须自己决定哪种方法是最好的。但总的来说:锁定就是答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2022-06-14
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多