芯友网Xin1234.COM

thinkphp mysql为什么要事务呢、什么事其它不可以处理的呢真是没事找事做



nus
为什么要事务呢、
什么事其它不可以处理的呢
真是没事找事做
✘苒荏光时
比如说你要批量修改商品的库存  如果其中有一个库存量不够 其他的库存就应该保持不变  如果不用事务你说怎么做
nus
先做可行性判断啊。
有多少个库存就统一做一次前置判断啊。
判断为真才一次性执行啊。
✘苒荏光时
那样会消耗数据库读写速度 而且有多个循环 系统也就耗时
不过我已经弄好了  没用tp的事务处理  使用原生的事务处理
nus
既然要用事务处理,就用TP的啊
M()->startTrans();
//TODO
增、删、改的操作
成功:M()-&get;commit();
失败:M()-&get;rollback();
✘苒荏光时
不过失败他会提示sql语句错误
我不想错误输出
nus
那你就是真的sql错误
真的sql错误相当于程序语法错误,当然执行不下去。
✘苒荏光时
不是  是库存量小于我要减掉的购买量  会报一个sql错误 意思就减不过
nus
是什么字段类型?
减了之后的数据无法保存,有可能的。
✘苒荏光时
int 无符号
nus
因为你字段类型不再支持负数。
✘苒荏光时
是的   本身设计的就是
nus
那就不行的了。
✘苒荏光时
库存量总不能是负的吧
nus
比如,一个整型的字段,你赋予一个字符串,当然报错。
这个是SQL的真正错误。
不是逻辑上的不可执行。
你应该先判断,如果不够减,就返回false,然后直接事务取消。
星星
好牛的样子
sun说的很符合逻辑
nus
 $User->rollback(); break;
✘苒荏光时

这个是我现在写的事务处理  我是不会tp里的设置异常模式
nus
呵呵,我是猜的,其实是我是一只菜鸟。
不过我认为,你给一个int无符号型的字段赋一个负值,肯定是会报错。是语法的错,不是事务不可执行的错。
你试试先判断原值是否大于要减去的值,如果不够减,就直接调用$pdo->rollBack();
✘苒荏光时
我知道是语法错误  但我不想让他以严重错误展现 倒着php执行脚本终端  所以用try和pdo异常模式 如果出现错误 会抛出 而不是脚本终端
nus
你看看这个无符号int型的范围:unsigned能存储的数据范围则是0~65535(这个最高位不用做符号位,所以是2的16次方,一共65536)
哪里容得下负数、
哦,那就是try的问题了。
你可以在try里写一个抛出异常试试
✘苒荏光时
所以 tp里怎么用pdo异常模式
nus
就是这个try没有捕捉到异常了
✘苒荏光时
tp没有setAttribute
不会设置tp里的setAttribute
星星
sun老师,推荐个tp进阶学习的地方,博客什么的
nus
你出错的问题是 catch (\PDOException $e) 这个地方
你改成catch (\Exception $e) 这个地方
就OK了
✘苒荏光时
我没有错
!!!!
已经测试好了
nus

又测试好了?
什么意思
没改动吗?
✘苒荏光时
好尴尬。。。
我是不会用tp做事务  不是说不会用原生的pdo做事务
nus
不懂
就是说tp事务啊
✘苒荏光时
恩恩
nus
原生的当然可以。
我们是要找出TP为什么捕捉不到异常
✘苒荏光时
这就难办了。。
nus
我觉得有两个可能:一个是不能有php error ,二个是捕捉的异常类型要写对,可以直接写根异常类\Exception
✘苒荏光时
哎  。。。 算了  还是用原生的吧
nus
?星星 你上次不是说可以快速仿站的吗?
我花了3个星期才仿得了的站,你居然说一周内可以完成。
星星
仿站有啥意思
nus
有人需要啊
没有意思也得做
需要总得到满足,这个社会才能和谐。
星星
比如,兽欲
nus
所以,禁不绝
总有人从事
?时光荏苒✘ 这个里有个文章是关于tp的异常处理的,http://www.thinkphp.cn/topic/23939.html
好像是要新建一个模型,并定义行为。
✘苒荏光时
666  就服你 我看看
巴欧

相关问题
------分隔线----------------------------
赞助商链接
赞助商链接
推荐内容