我有一个php文件,它定期从mysql DB中写入和读取表格。
我有另一个同时运行的ruby文件,它读取和写入mysql DB中的相同表。
此设置可能存在潜在问题吗?
答案 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)
是。有。您应该使用事务来确保只有一个实例正在访问数据,并且如果有错误,您可以回滚。
此外,它取决于您使用的存储引擎。