我最近被告知我应该在我的应用程序中使用事务,因为它们可以帮助更快地运行代码并防止MySQL代码在整个页面加载之前执行(例如,如果某人只是在我的页面刷新并且整个页面没有' t load,没有MySQL调用会启动,它会减少服务器上的负载。)
我想知道我是否想将我的网站切换到交易,这有多难以及我需要做出哪些改变?
另外,我正在使用PDO而不是mysql_*
,如果这会有所不同吗?
答案 0 :(得分:4)
网络应用程序中的交易通常用于Atomicity和Isolation。
他们没有“阻止MySQL代码在整个页面加载之前执行”:当您使用PDO或{{mysql_query
(或任何等价物)调用时,仍会执行MySQL查询1}})。但如果你不进行交易,他们都将被“取消”。
他们与帮助“更快地运行代码”没有多大关系;即使它们有时可以产生这种效果,也只是因为如果你没有明确地将一个事务用于一组查询(导致只有一个事务),MySQL将隐式地为每个查询使用一个事务(导致多个事务,可能会对数据库服务器造成一些额外的负载)
注意:
使用PDO时,mysqli_*
或mysql_*
在这里不应产生太大影响 - 即使建议不要使用mysqli_*
(旧的,不支持) MySQL的一些特性> = 4.1,例如准备好的语句)。
答案 1 :(得分:1)
实际上,当您使用RDBMS时,您正在使用事务 。但是,除非您在事务开始和结束时显式,否则您隐式允许每个SQL语句启动并完成单独的事务。这也称为“自动提交”。
事务是通过多个SQL语句创建逻辑变更集的好工具,因此您可以将整个更改集作为一个单元提交或回滚,并确保您的更改使数据库保持一致状态。交易主要不是为了提高绩效。
开始和完成任何交易的开销很小。如果您对高容量更改使用隐式事务,则会放大,从而导致每个语句的开销。例如,如果您运行数千个INSERT
语句来执行批量数据加载,每个INSERT
隐式地在单独的事务中,这就变得很重要。在其他情况下,使用事务而不是使用事务的性能优势是微不足道的,尤其是在像PHP这样具有“无共享”架构的语言中。
答案 2 :(得分:0)
交易提供ACID,而不是让你的“代码更快”。
如果有的话,他们会让它变慢。我建议你在得出这样的结论之前对交易做更多的研究。
答案 3 :(得分:0)
我不知道MySQL的事务速度,但在SQLite中使用事务通常会更快,但我相信在MySQL中,它们会减慢你的速度。
关于你需要做出的改变,好吧......几乎没有:
BEGIN TRANSACTION
$result = [execution of several queries]
if $result fails -> ROLLBACK, else COMMIT
我还建议你在mysqli或mysql上使用PDO。