交易优先?

时间:2015-08-29 15:47:05

标签: php mysql

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

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

现在,数据插入是一个很长的过程大约需要3-6分钟,而cron是每个3分钟,因此有时会发生进程冲突。 我看到当我在循环中添加提交时,优先级有新进程,我能以某种方式说新的事务等待直到事务提交之前?

2 个答案:

答案 0 :(得分:1)

您可以将某些锁存储在持久性的某个位置,通常是在文件系统中的某个锁定文件中完成的:

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

这样你就可以每分钟触发你的触发器脚本(cron job),而不会有任何风险。

可以在数据库甚至表级上完成相同的操作。但是,根据情况,这可能不那么强大,因为如果数据库连接出现问题,它显然会失败。涉及的层数越少,越稳健。和往常一样:你必须自己决定什么方法是最好的。但总的来说:锁定就是答案。

答案 1 :(得分:1)

我会尝试Keep It Simple 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);
?>