前言:
在操作数据库中,实现一个功能时有时候会多次操作数据库,
在多次操作数据库时,就会有可能出现其中一条sql语句执行成功,而另一条sql语句执行失败。
这样的话就会出现很严重的问题,所以可以用MySQL的事务处理来解决这个问题。
!!:在处理多表操作的时候一般是需要用到事务处理的!
//1、开启事务
DB::beginTransaction();
try{
//2、执行成功时提交事务
DB::commit();
}catch(\Exception $exception){
//3、执行成失败时回滚
DB::rollBack();
}
注意:
其中要注意一点的是,catch里面的抛出异常,Exception前面要加上一个‘\’,不然的话在框架里面他会找不到这个类,然后就不会抛出异常。框架就会直接报错,起不到事务的作用。
//用户注册demo
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class LoginController extends Controller
{
public function register(Request $request)
{
$rules = [
'mobile' => 'required',//laravel-sms
'password' => 'required|confirmed|min:8',
];
$msg = [
'mobile.required' => '请输入手机号码',
'password.required' => '请输入密码',
];
$validator = Validator::make($request->all(), $rules, $msg);
if ($validator->fails()) {
$this->throwValidatorException($validator);
}
$mobile = $request->input('mobile');
$password = $request->input('password');
//手机号码查重
$user = User::where('mobile', $mobile)->first();
if ($user) {
return $this->errorWithInfo('手机号码已存在');
}
DB::beginTransaction();
try{
$user = User::create([
'mobile' => $mobile,
'password' => Hash::make($password),
]);
//用户仓库,创建用户的时候 赋予用户道具 土地等属性(在仓库表中体现)
UserTool::create([
'uid' => $user->id,
'tool_id' => Daoju::TOOL_SEEDER,
'pay_time' => Carbon::now()->timestamp,
'nums' => 1,
]);
DB::table('oauth_access_tokens')->where('user_id', $user->id)->update(['revoked' => 1]);
DB::commit();
return $this->proxy($mobile, $password);
} catch (\Exception $exception) {
DB::rollBack();
return $this->errorWithInfo($exception->getMessage());
}
}
}