MYSQL TRANSACTION替代方案?

时间:2015-03-07 06:34:22

标签: php mysql transactions

使用PHP / MYSQL我试图为我的网站创建一个简单的搜索。我在mytable中拥有所有页面数据,并按此顺序处理数千行:

 1. Query for 1 row with a particular id in `mytable` with column `status=0`
 2. Using that id do something in `other` table(s) 
 3. When done, update `mytable` with`status=1`

已编辑

在步骤2中,我处理来自步骤1的所有数据,例如

  • 对每个单词进行标记并处理数据
  • 获取所有链接和流程数据
  • 获取所有图像和处理数据等。

为了加快进程,我想运行多个脚本以便我可以更快地处理所有行,然后我开始了解并发问题。我读了Mysql TRANSACTION,这个过程是TRANSACTION的典型例子。

对于记录,所有表格均为INNODB,以便我可以使用TRANSACTION / LOCK。如果我使用TRANSACTION,那么问题是每个脚本都会等待一个完整的行进程(第2步需要更长时间),然后该进程需要同样的时间,因为只有一行处理1行!

有人可以建议,我如何继续使用TRANSACTION OR LOCK或其他一些表结构的其他替代方法,以便我可以通过运行更快/同时处理mytable中的每个ROW同一个PHP脚本多次在一起?

我已经尝试了SOLRLUCENESPHINX并且很抱歉,但是对我来说,所有技术都太技术了,对不起我的这个限制:(。

3 个答案:

答案 0 :(得分:2)

您可以将transaction_isolation级别设置为READ UNCOMMITTED以最小化锁定。在php脚本中将它设置在会话级别。

InnoDB默认具有REPEATABLE READ隔离级别。

SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
SET SESSION tx_isolation='READ-UNCOMMITTED'; 

要了解有关隔离级别的更多信息,请检查http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html

答案 1 :(得分:1)

我不确定我理解你的确切问题,但是我试一试....

你喜欢这样:

 1. Query for 1 row with a particular id in `mytable` with column `status=0`
 2. Using that id do something in `other` table(s) 
 3. When done, update `mytable` with`status=1`

你不能这样做吗?

 1. Query for all rows in `mytable` with column `status=0`
 2. Save those rows in a temporary table
 3. Iterate the temporary table to do some things in `other` table(s) 
 4. When done, update all rows that should be affected in `mytable` with`status=1` (with TRANSACTIONS)

这样,您只需在更新时使用TRANSACTIONS。我认为这种方法会快得多,因为你只需要进行单一查询就可以了。

<强>更新

你总是可以做这样的事情来创建一个id为零的临时表:

(首先手动创建一个名为temptable的表格一次)

DROP temptable;
INSERT INTO `temptable`( mytable_id )
SELECT  id FROM `mytable`WHERE status = 0 

答案 2 :(得分:0)

其他&#39;正在做什么?表。根据您是否需要外部计算,您可以通过带有子选择的单个查询完成所有操作。如果计算基于两个表中的数据,则可以用这种方式编写。在大多数情况下,SQL不需要迭代,但直接作用于连接关系的每个交叉产品元组。

简而言之,请告诉我们更多关于您在步骤1&amp; 2然后我们可以看到。

(或者,您可以切换到支持存储过程的DB并以这种方式运行。)