首页 » 网站建设 » phppdo剧本技巧_PHP中运用PDO操作事务的一些小测试

phppdo剧本技巧_PHP中运用PDO操作事务的一些小测试

duote123 2024-11-28 0

扫一扫用手机浏览

文章目录 [+]

关于事务的问题,我们就不多阐明了,往后在学习 MySQL 的干系内容时再深入的理解。
本日我们紧张是对 PDO 中操作事务的一些小测试,或许能创造一些比较好玩的内容。

在 MyISAM 上利用事务会怎么样?

首先,相信只假如学过一点点的 MySQL 干系知识的人都知道,在 MySQL 中常用的两种表类型便是 InnoDB 和 MyISAM 这两种类型。
当然,我们本日也不讲它们全部的差异,但有一个差异是最明显的,那便是 MyISAM 不支持事务。
那么,如果我们在 PDO 操作中对 MyISAM 进行事务操作会怎么样呢?

phppdo剧本技巧_PHP中运用PDO操作事务的一些小测试

//myisamtry{$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$pdo->beginTransaction();$pdo->exec("insertintotran_myisam(name,age)values('Joe',12)");$pdo->exec("insertintotran_myisam2(name,age)values('Joe',12,33)");//sleep(30);$pdo->commit();}catch(Exception$e){$pdo->rollBack();echo"Failed:".$e->getMessage(),PHP_EOL;}

tran_myisam 和 tran_myisam2 表都是 MyISAM 类型的表,在这段代码中,我们故意写错了 tran_myisam2 的插入语句,让它走到 catch 中。
实际实行的结果是,报错信息正常输出,tran_myisam 表的数据也被插入了。
也便是说,针对 MyISAM 表的事务操作是没有效果的。
当然,PDO 也不会主动报错,如果我们让第二条 SQL 语句也是正常语句的话,PDO 只会正常实行结束,不会有任何的缺点或者提示信息。

phppdo剧本技巧_PHP中运用PDO操作事务的一些小测试
(图片来自网络侵删)

//innodbtry{$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$pdo->beginTransaction();$pdo->exec("insertintotran_innodb(name,age)values('Joe',12)");$pdo->exec("insertintotran_innodb2(name,age)values('Joe',12,3)");//sleep(30);$pdo->commit();}catch(Exception$e){$pdo->rollBack();echo"Failed:".$e->getMessage(),PHP_EOL;}

我们可以打开 sleep(30); 这行代码的注释,也便是在事务提交前停息 30 秒,然后在 MySQL 中查看 infomation_schema.INNODB_TRX 表。
这个表中显示的便是正在实行中的事务。
在 InnoDB 类型的表实行时就可以看到一条事务正在实行的记录,而 MyISAM 类型的表中则不会看到任何信息。

不提交不回滚事务会发生什么?

假设我们忘写了 commit() ,同时也没有报错,这条语句会实行成功吗?就像下面这段代码一样。

try{$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$pdo->beginTransaction();$pdo->exec("insertintotran_innodb(name,age)values('Joe',12)");$pdo->exec("insertintotran_innodb2(name,age)values('Joe',12)");//忘却写$pdo->commit();了}catch(Exception$e){$pdo->rollBack();echo"Failed:".$e->getMessage(),PHP_EOL;}

PHP 会在脚本实行结束后,实在也便是在 $pdo 工具析构时回滚这个事务。
也便是说,这里的 SQL 语句是不会实行的。
但是,只管即便不要这么做,由于在正式环境中,我们的代码非常繁芜,而且不一定会析构成功。
这样的话,可能会有永劫光霸占的事务存在,终极结果便是会导致 MySQL 的 IPQS 奇高,而且还很难找到缘故原由。
以是,在利用事务的时候,一定要记得 commit() 和 rollBack() 都是我们的亲兄弟,绝不能落下他们。

上一个事务没有提交没有回滚,下一个事务会实行吗?

同样的,在上一个问题的根本上我们再连续延伸。
如果有两个事务依次实行,第一个事务没有提交,没有回滚,那么下一个事务还能实行吗?

//innodbtry{$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$pdo->beginTransaction();$pdo->exec("insertintotran_innodb(name,age)values('Joe',12)");$pdo->exec("insertintotran_innodb2(name,age)values('Joe',12)");//忘却写$pdo->commit();了}catch(Exception$e){$pdo->rollBack();echo"Failed:".$e->getMessage(),PHP_EOL;}//innodbtry{$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$pdo->beginTransaction();$pdo->exec("insertintotran_innodb(name,age)values('BW',12)");$pdo->exec("insertintotran_innodb2(name,age)values('BW',12)");//sleep(30);$pdo->commit();}catch(Exception$e){$pdo->rollBack();echo"Failed:".$e->getMessage(),PHP_EOL;//Failed:Thereisalreadyanactivetransaction}

我们可以看到,第二段事务直接就报错了,内容是:“这里有一个已经存在的活动事务”。
也便是说如果上一个事务没有提交没有回滚的话,第二个事务是无法实行的。

总结

本日我们只是学习并测试了几个事务干系的小问题,但问题虽小却有可能带来严重的线上事件,大家在开拓的时候一定要小心。
关于事务的详细内容在将来深入学习 MySQL 的时候我们再好好研究。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP中利用PDO操作事务的一些小测试.php

参考文档:

https://www.php.net/manual/zh/pdo.transactions.php

标签:

相关文章

微信第三方登录便捷与安全的完美融合

社交平台已成为人们日常生活中不可或缺的一部分。微信作为我国最受欢迎的社交软件之一,拥有庞大的用户群体。为了方便用户在不同平台间切换...

网站建设 2025-02-18 阅读1 评论0

广东高速代码表解码高速公路管理智慧

高速公路作为国家交通动脉,连接着城市与城市,承载着巨大的物流和人流。广东作为我国经济大省,高速公路网络密布,交通流量巨大。为了更好...

网站建设 2025-02-18 阅读1 评论0