2016-01-01 15 views
6

मैं कैसे उपयोग/सही ढंग से lockforupdate परीक्षण करने के लिए यह पता लगाने की कोशिश कर रहा हूँ, लेकिन मैंने पाया कि मैं क्या उम्मीदLaravel lockforupdate (निराशावादी लॉकिंग)

इस

की तरह कार्य नहीं कर रहा है सिर्फ

public function index() { 
     return dd(\DB::transaction(function() { 
      if (\Auth::guard('user')->check()) { 
       $model = \App\Models\User::find(1)->lockForUpdate(); 
       sleep(60); 
       $model->point = 100000; 
       $model->save(); 
      } else { 
       $model = \App\Models\User::find(1); 
       $model->point = 999; 
       $model->save(); 
      } 

      return $model; 
     })); 
} 

परीक्षण कर रहा है मैं 2 ब्राउज़र में परीक्षण करने का प्रयास करता हूं, ब्राउजर 1 उपयोगकर्ता लॉग इन नहीं करता है और ब्राउजर 2 लॉग इन नहीं होता है, ब्राउजर 1 हिट रीफ्रेश होता है, फिर लॉकफोर्डेडेट करेगा और 60 सेकंड में अद्यतन

60 सेकेंड में, मैं ब्राउज़र 2 पर जाता हूं और हिट करता हूं रीफ्रेश करें, हालांकि रिकॉर्ड लॉक नहीं है, मैं phpmyadm की जांच करता हूं में और रिकॉर्ड अद्यतन किया जाता है (ब्राउज़र 1 से 60 सेकंड ताला ट्रिगर के अंदर) के

लेकिन 60 सेकंड के बाद, रिकॉर्ड ब्राउज़र 1 (प्वाइंट 100000)

द्वारा फिर से संशोधित किया गया है तो मैं गलत समझ lockforupdate है कर रहा हूँ के लिए उपयोग करें? या मैं गलत तरीके से परीक्षण?

मैं क्या उम्मीद पंक्ति (लोड हो रहा है फ़ेविकॉन या त्रुटि के साथ रिक्त पृष्ठ फेंक?)

https://laravel.com/docs/5.2/queries#pessimistic-locking

पहले 60 सेकंड में ब्राउज़र 2 द्वारा संशोधित नहीं किया जाना चाहिए और मैं कुछ शोध किया है लेकिन अभी भी है क्या नहीं समझ सकता sharedLock (शेयर मोड में लॉक) और lockForUpdate (अद्यतन के लिए) के बीच विभिन्न

btw मैं इस बात की पुष्टि डेटाबेस

InnoDB है

उत्तर

9

यह काम, अंत में, लेकिन अभी भी समझ में नहीं आता क्या है haredLock (शेयर मोड में लॉक) और lockForUpdate (अद्यतन के लिए) अलग

public function index() { 
     return dd(\DB::transaction(function() { 
      if (\Auth::guard('user')->check()) { 
       $model = \App\Models\User::lockForUpdate()->find(1); 
       sleep(30); 
       $model->point = 100000; 
       $model->save(); 
      } else { 
       $model = \App\Models\User::lockForUpdate()->find(1); 
       $model->point = $model->point + 1; 
       $model->save(); 
      } 

      return $model; 
     })); 
    } 
+2

डॉक्स से: https://laravel.com/docs/5.2/queries#pessimistic-locking केवल लिखने, lockForUpdate के लिए sharedLock ताले उन्हें – cdarken

+0

चुनने से रोकता है मल्टी-यूज़र-एक्सेस के बीच डेटाबेस को संभालने के लिए लेनदेन ताले का उपयोग किया जाता है। यदि आपकी तालिका लॉक है, तो अन्य उपयोगकर्ता इसे एक्सेस नहीं कर सकते हैं। तो डेटा ठीक से प्रबंधित किया जाता है। –

संबंधित मुद्दे