我有crons每3分钟运行一次脚本,脚本包含的功能是什么:
try
begin transaction
loop
//parse large xml data
//send data to database
endloop
commit
endtry
catch
rollback
endcatch
现在,数据插入是一个很长的过程大约需要3-6分钟,而cron是每个3分钟,因此有时会发生进程冲突。 我看到当我在循环中添加提交时,优先级有新进程,我能以某种方式说新的事务等待直到事务提交之前?
答案 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);
?>