有关天猫网站开发的论文,热狗seo顾问,wordpress调用小工具,贵阳网站开发工程师招聘网倒着思考。杜绝纯粹的知识填鸭教育少废话#xff0c;是上代码#xff1a;update table1 set money-100 where id1; //A账户减少100元update table2 set money100 where id2; //B 账户增加100元问题#xff1a;这是一个简单的银行转账案例sql#xff0c;由于服务器等未知原因…倒着思考。杜绝纯粹的知识填鸭教育少废话是上代码update table1 set money-100 where id1; //A账户减少100元update table2 set money100 where id2; //B 账户增加100元问题这是一个简单的银行转账案例sql由于服务器等未知原因可能出现两条sql一个执行成功一个执行失败的情况下一个账户没有成功增加100元另一个账户缺减少了100元。要实现这两条sql语句必须都要成功或者都要失败。请问让你设计一种方案怎么去着手初步思考方案一每条sql语句都加判断是否成功失败就不再往下走if(!mysql_query(update table1 set money-100 where id1)){//失败就停止退出}if(!mysql_query(update table1 set money-100 where id1)){//失败就停止退出}总结仔细想如果第一条语句执行成功了而第二条语句执行失败了呢还不严谨。由此进一步考量应该是无论哪条语句执行失败都要能撤销已执行全部的操作。设想假如有这么一条命令叫做rollback可以撤销已执行的全部操作。那么修改后的方案二if(!mysql_query(update table1 set money-100 where id1)){//撤销rollbackexit;}if(!mysql_query(update table1 set money-100 where id1)){//撤销rollbackexit;}总结貌似应该没问题了。再揣摩发现我们撤销操作应该是撤销到哪才算呢不能把更早之前的所有执行的sql都撤销掉吧起码有个位置。怎么办在这两条语句前加一个开始命令只撤销到开始位置。设想有一个begin的开始命令。那么修改后的方案三mysql_query(begin)if(!mysql_query(update table1 set money-100 where id1)){//撤销rollbackexit;}if(!mysql_query(update table1 set money-100 where id1)){//撤销rollbackexit;}总结这下貌似是真的可以了再仔细揣摩发现还有点问题假如第一条语句执行成功了突然服务器宕机了命令没有再往下走仍然是不行的。怎么办在末尾加一个收尾的命令如果mysql能执行到这条命令那么才算真正完成数据更新了不然以前的操作还都不算。设想有一个叫commit的收尾的命令那么修改后的方案四mysql_query(begin)if(!mysql_query(update table1 set money-100 where id1)){//撤销rollbackexit;}if(!mysql_query(update table1 set money-100 where id1)){//撤销rollbackexit;}mysql_query(commit)-------------------------------------------------------------------------------------------------------------------------------正着学习。弥补严谨自己的思维逻辑学习下mysql中给我的解决方案它把上述我们解决的问题叫做事务处理。同样mysql为了解决上述的问题也有三个命令分别是begin、rollback、commit一样的begin; //开启事务update table1 set money-100 where id1; //A账户减少100元update table2 set money100 where id2; //B 账户增加100元commit; //提交事务准确的说凡是事务内的语句只要能被mysql接收到都能保证全部执行但是但是并不能保证都执行成功。失败时需要自己主动去判断主动去回滚。(极其错误的认知认为只要把事务写出来最后用commit提交一下数据库会自动判断这些语句是否全执行成功如果成功则把所有的数据插入到数据库如果有一条失败就自动回滚至原始状态)严格的事务使用流程案例演示If(!mysql_query(begin)){//如果事务没开启成功那么后面的语句真的就是真实执行了,需要 主动判断一下//退出exit;}If(!mysql_query(update table1 set money-100 where id1)){//回滚rollback// 退出}If(!mysql_query(update table2 set money100 where id2)){//回滚rollback//退出}If(!mysql_query(commit)){//回滚rollback //如果客户端把commit已经发送到了mysql执行失败了最好也要判断主动立即去回滚虽然数据库最终会慢慢自动回滚。因为事务一直未提交上面执行的写操作语句会给当前操作数据锁住其他用户不能操作这条数据直到等待事务结束才能。(提交或回滚)。}有时候根据业务需要我们对操作的数据需要保持一个较高的一致性可以考虑使用事务。付费小密圈1、解答大家php学习开发过程的问题2、 分享不同php项目实战经验3、定期邀请大牛进圈做知识分享4、持续分享优质php知识教程