为什么php 框架的数据库操作类,在插入和更新失败的时候为什么不能直接抛出系统异常?????而要自己再进行判断返回结果?
php 是通过fpm来处理请求,一个fpm进程处理一条请求,在数据库增删改查执行遇到错误时,就说明这条请求失败了,为什么框架在处理DB类的时候不能直接抛出异常,这样在一个事务中执行多个增改查就无须判断每条语句的执行结果了。
举个例子
class A {
public function testA(){
try {
DB::beginTransaction();
$res = GoodsModel::on()->where('id', $id)->update();
if ($res) { // 如果update失败了 就直接停了,走catch语句不是更好
$retCode = OrderModel::on()->insert();
if (!$retCode) {
throw new Exception("处理失败");
}
}
DB::commit();
} catch (Exception $ex) {
DB::rollback();
throw $ex;
}
}
}
如果用异常方式,这样不是更好????还请大佬作出解答!
class A {
public function testA(){
try {
DB::beginTransaction();
GoodsModel::on()->where('id', $id)->update();
OrderModel::on()->insert();
DB::commit();
} catch (Exception $ex) {
DB::rollback();
throw $ex;
}
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
高认可度评论:
$res
为隐士的false
的时候不代表数据库语句执行失败了 只是代表受影响行数为0
比如 有一条
user
表数据ID
为42name
为jack
受影响行数是0 但这并不代表数据库语句执行失败了
$res
为隐士的false
的时候不代表数据库语句执行失败了 只是代表受影响行数为0
比如 有一条
user
表数据ID
为42name
为jack
受影响行数是0 但这并不代表数据库语句执行失败了
执行失败本来就会抛出异常吧?
例如你需要update一个订单的状态为发货状态,但是update语句返回了影响行数为0,这时候就说明有异常情况出现了吧。
执行失败 意味着 在此行代码中断 抛出异常 代码从上到下执行完毕的 怎么可以定义人家为异常 或者说失败 你所谓的异常只是自己的业务逻辑而已
正常来说项目里面插入失败,是不会直接让代码直接抛异常的。是记录日志多一点
mark
你想说的是saveOrFail?
你用的不是laravel框架吧,我用laravel向来都是从来不判断返回值,失败会自动抛出异常,就像你举得这个例子,我项目里基本都差不多是这个样子
其他的框架像老的TP,或者自己封装覆盖了一层 try catch 返回false一类的,这是个人习惯问题。
不是所有 SQL 执行后,都会有返回值, 所以这逻辑只要 SQL 能成功执行, 就代表是成功的,但是, SQL 语句执行成功但是影响函数为0, 这算异常吗, 大部分业务都不算异常吧, 所以小众的需求就自己写下逻辑判断咯.
建议换成: 数据库事务

我以为只有我一个人会这样想 :joy:
大可不必,Laravel 的 DB::transaction 不香吗?有错误就是直接抛异常,自动回滚。