2016-11-17 14 views
2

EloquentでlockForUpdateを使用していると思われます。Laravel 5.1 DB BuilderとEloquentのlockForUpdateの違いは何ですか?

 DB::beginTransaction(); 
     User::find(1)->lockForUpdate(); 
     ... (doing some logic) 
     DB::commit(); 

しかし

DB::table('users')->where('id', '=', $userId)->lockForUpdate() 

を使用して、常に動作します。これら2つのlockForUpdate()の違いは何ですか?

  • Laravelバージョン:5.1
  • PHPバージョン:5.7
  • データベースドライバ&バージョン:MySQLの14.14
+0

興味深い質問のようです。しかし、正確には*動作していますか?*動作しませんか?予期しない動作やエラーメッセージがあれば説明してください。 – alariva

+0

@alariva、私の場合、ユーザーごとにユーザープロファイルテーブルに一意のエントリを作成しようとしました。ユーザーが誤って「保存」ボタンを2回クリックすると、ユーザーが多くのクリックを引き起こすのを防ぎませんでしたが、User :: find(1) - > lockForUpdate();という2つの行がユーザープロファイルテーブルに作成されます。だから私はそれが正しくロックされていないと思う。何か意味がありますか? – user1688099

+0

今見ましたが、行をロックするだけではありません。一方、usersテーブルだけを扱っても、他のテーブルの同じ問題からあなたを救うことはできません。私は自分のプロジェクトに全く同じ問題(未解決)があります。(https://github.com/timegridio/timegrid/issues/20)良いニュースは、あなたが少なくとも 'users'テーブル。 – alariva

答えて

0
User::lockForUpdate()->find(1); 

これは次のようになり、作業モデルではなく戻ります

find()クエリビルダ。

lockForUpdate()はクエリビルダのメソッドです

関連する問題