php&访问相同数据库和表的ruby脚本会导致损坏吗?

时间:2010-01-08 09:35:56

标签: php mysql ruby concurrency

我有一个php文件,它定期从mysql DB中写入和读取表格。

我有另一个同时运行的ruby文件,它读取和写入mysql DB中的相同表。

此设置可能存在潜在问题吗?

3 个答案:

答案 0 :(得分:3)

MySQL并不关心它是PHP还是Ruby。 ,但多个客户端同时访问数据库存在潜在问题很多可能出错。

只是一个随机的例子:

客户端1打算a)从整数column_x(= 10)中减去10,然后b)将此10添加到整数column_y。

想象客户端1完成了步骤a),但在它设法做b)之前,客户端2来了,只有当column_x或column_y值为正时才打算做某事。并且错误地什么也没做,只要10还未到达column_y。

基本上,你遇到了multiple execution threads with a shared state的所有问题。

为解决此类问题,transactions存在。 MySQL提供了几个transaction isolations levels,它依赖于表的存储引擎。

因此,所有修改(以及REPEATABLE READ& SERIALIZABLE隔离级别的读取)必须在数据库事务中执行,从START TRANSACTION开始,以{{1}结尾} SQL语句。如果您的例程中间存在问题,并且您无法完成整个事务,请执行COMMIT以撤消自ROLLBACK调用以来所做的所有更改。

答案 1 :(得分:0)

假设您使用的是MySQL,可以使用:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

更多信息,请参阅:
http://dev.mysql.com/doc/refman/5.0/en/commit.html
http://www.tutorialspoint.com/mysql/mysql-transactions.htm

答案 2 :(得分:-1)

是。有。您应该使用事务来确保只有一个实例正在访问数据,并且如果有错误,您可以回滚。

此外,它取决于您使用的存储引擎。