thinkphp5使用mysql事务的高级应用
1. 事务块中如果包含第三方接口调用,把第三方接口部分放到最后,自己业务的sql放到上面,如果自己的sql失败了,抛出异常,自然也就不会执行到第三方接口部分。也就是说一旦sql出现了异常,就直接到catch里面了,不会继续走到下面的三方接口了。
2. 事务块中如果调用自己写的函数,比如微信支付退款,能否在函数里面再次使用事务呢?比如函数里面封装退款以及记录退款日志到sql。答案是可以的,退款调用三方接口这种不需要事务,如果成功或者失败,在写一个函数去写日志即可。写日志函数里面用事务,切记不要向外部抛出异常,否则会导致外层的事务捕获到异常回滚。不要让这个退款接口的日志影响的退款状态的业务逻辑。
3. 事务块中的函数里面的事务必须写commit否则就算其他地方都没有异常最外层也不会提交。函数内部的sql提交回滚不会影响到外层(比如事务块中有两个函数第一个函数里面commit了,第二个函数里面仍然可以rollback,只是这个函数里面回滚),但是外层的sql失败回滚会影响到内层函数的sql回滚(尽管内层已经commit了)。两个函数里面都commit了,最外层最后也要commit才能成功。
4. 外层try catch能否捕获到函数内部的异常呢?答案是肯定会的。手动的抛出异常是可以捕获到的,sql的异常外面自动捕获。 如果不想让内部的自动抛出异常导致外面捕获,导致sql回滚,可以在函数内部增加try catch 把捕获到的异常在catch内不要向外层抛出即可。
5. 函数内的commit必须得有要,外层回滚内层的commit不生效(也就是外层rollback了,内层所有函数即使commit了,也无效),函数内层会自动回滚,但是函数内提交要有,要不然外层提交,内层不会自动提交,但是外层没有回滚正常提交了,内层不会自动提交,所以内层必须要有提交。函数内部不写提交,外层提交了,整体也不提交。
6. 如果函数内没有写回滚,在抛出异常的情况下会导致外层事务回滚(如果没有在catch里面手动抛出异常到外层,外层也会回滚,但是没有异常),函数内有异常写了回滚,没有向外层抛出异常,外层能提交(函数内部的sql会失败)。所以函数内层一定要有回滚机制。
版权声明:若无特殊注明,本文皆为《菜鸟站长》原创,转载请保留文章出处。
本文链接:thinkphp5使用mysql事务的高级应用 - http://wziyi.com.cn/?post=335