PHP执行多条sql语句插入或更新一条记录时如何避免脏数据?

场景是:
表单里有两部分数据(A部分 B部分) 在mysql数据库表的一条记录里
我先insert一条记录到一张表里 这里是A部分post过来的表单数据
接着将B部分POST过来的数据 更新到刚才这条记录里
这两次操作中如果中间服务或数据库出错
如何避免只往数据库里写入了部分数据?
判断一下是否全了 再删除重新执行?这样貌似效率很低

阅读 2.2k
2 个回答

1.用事务啊,要么全执行,中间失败则全部回滚。

DB::beginTransaction();
try{
    //你的代码
    DB::commit();  //提交
}catch(\Throwable $exception){
    DB::rollBack();  //回滚
}

2.如果是新增的脏数据,比如快速点击注册,注册了两次,可以使用原子锁。
原子锁(依托于redis实现)的代码:

if (Cache::lock('foo', 10)->get()) {
    // 获取锁定10秒...

    Cache::lock('foo')->release();
}

注:用的laravel

他的意思是两次请求 A表单和B表单都是同一条数据

根据业务可以先把A表单或者B表单数据存在session或者缓存里面
当A和B的表单数据都存在在进行写入操作然后再一次写入成功
清除缓存
这个方案要避免缓存被清理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题