2016-04-04 8 views
23

मेरे पास टेस्ट क्लास पर एक विधि में बहुत छोटा डेटासेट उत्पन्न होता है, मैंने setUp() विधि में उत्पन्न डेटा रखने का प्रयास किया था, लेकिन यह प्रत्येक परीक्षण के लिए लॉक प्रतीक्षा टाइमआउट की ओर अग्रसर था। इस कोड को setUp() विधि से बाहर ले जाना और इसे अपनी विधि में डालने से थोड़ा सा मदद मिली है। मतलब यह है कि हर परीक्षण ताले के बारे में शिकायत नहीं करता है।मॉडल फैक्ट्रियों का उपयोग करके MySQL लॉक प्रतीक्षा टाइमआउट

मैं डाटाबेस ट्रांस्सेक्शन विशेषता का उपयोग कर रहा हूं जो लैरवेल 5.2 में है ताकि प्रत्येक टेस्ट केस चलाने से पहले डेटाबेस रीसेट हो।

प्रत्येक टेस्ट केस में मैंने इस तरह नकली डेटा प्राप्त करने के लिए एक कॉल किया है।

$data = self::getRandomCommunityWithAssociatedData(); 

वास्तविक विधि केवल बनाए गए समुदाय के लिए कुछ समुदाय वस्तुओं और उपयोगकर्ता वस्तुओं को उत्पन्न करती है।

public static function getRandomCommunityWithAssociatedData() 
{ 
    self::$communities = factory(\Community::class, self::COMMUNITIES_TO_CREATE)->create()->each(function ($community) { 
     self::$users[$community->id] = factory(User::class, self::USERS_TO_CREATE)->create()->each(function (\User $user) use ($community) { 
      $user->community()->associate($community); 
     }); 

     self::$admins[$community->id] = factory(User::class, 'superadmin', self::ADMINS_TO_CREATE)->create()->each(function (\User $admin) use ($community) { 
      $admin->community()->associate($community); 
     }); 
    }); 

    $community = self::$communities[mt_rand(0, count(self::$communities) - 1)]; 

    return ['community' => $community, 'users' => self::$users[$community->id], 'admins' => self::$admins[$community->id]]; 
} 

कि विधि में उपयोग में कुछ स्थिरांक हैं और वे निर्धारित करने के लिए कैसे प्रत्येक वस्तु के कई बनाने के लिए इस्तेमाल कर रहे हैं। वर्तमान में मैं प्रत्येक समुदाय के उदाहरण के लिए 2 समुदायों और 3 उपयोगकर्ताओं और 2 व्यवस्थापक बना रहा हूं।

लॉक प्रतीक्षा टाइमआउट अनुमानित नहीं हैं, एक रन यह पहले टेस्ट केस पर हो सकता है, यह एक और रन 5 वें टेस्ट केस पर हो सकता है।

मैंने उस समय को बढ़ाने की कोशिश की है जिसमें MySQL लॉक के लिए 500 सेकंड तक प्रतीक्षा करता है और मुझे अभी भी टाइमआउट मिल रहा है। इस बार बढ़ाना वास्तव में एक विकल्प नहीं है क्योंकि परीक्षणों को सभी वातावरणों पर चलाने में सक्षम होना चाहिए।

इस तरह के एक छोटे डेटासेट के साथ Laravel 5.2 में डेटाबेस ट्रांस्सेक्शन विशेषता का उपयोग करते समय मुझे इन लॉक प्रतीक्षा टाइमआउट क्यों मिल रहे हैं?

1) UserEmailNotificationsTest::testActiveAdminReceivesNewCommentEmailNotification 
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction (SQL: insert into `communities` (` 

ऊपर क्वेरी कि निष्पादित किया जाता है समुदाय की मेज पर एक साधारण डालने है और कोई जटिल सबक्वेरी या कि इस डेटा पीढ़ी में हो रहा ऐसा कुछ कर रहे हैं।

क्वेरी लॉग, परिणाम सक्षम।

 30 Query START TRANSACTION 
     30 Query SAVEPOINT trans2 
     30 Prepare insert into `communities` (`viddler_id`, `domain`, `subdomain`, `active`, `max_seats`, `created_at`, `updated_at`, `assignment_seats`, `general_settings`, `access_settings`, `branding_settings`) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
     30 Execute insert into `communities` (`viddler_id`, `domain`, `subdomain`, `active`, `max_seats`, `created_at`, `updated_at`, `assignment_seats`, `general_settings`, `access_settings`, `branding_settings`) values ('74', 'gaylord.com', 'qui', '1', '24', '2016-03-30 16:25:45', '2016-04-04 02:27:04', '23', 'a:11:{s:5:\"title\";s:0:\"\";s:11:\"description\";s:0:\"\";s:10:\"meta_title\";s:0:\"\";s:16:\"meta_description\";s:0:\"\";s:13:\"meta_keywords\";s:0:\"\";s:17:\"thumbnail_display\";s:0:\"\";s:18:\"group_nomenclature\";s:8:\"Channels\";s:13:\"home_template\";s:0:\"\";s:11:\"api_version\";s:1:\"2\";s:8:\"language\";s:2:\"en\";s:21:\"use_nested_navigation\";i:0;}', 'a:10:{s:12:\"restrictions\";s:10:\"Restricted\";s:17:\"auto_registration\";i:0;s:14:\"default_active\";i:0;s:12:\"oauth_google\";i:0;s:14:\"oauth_facebook\";i:0;s:14:\"oauth_linkedin\";i:0;s:16:\"oauth_reg_google\";i:0;s:18:\"oauth_reg_facebook\";i:0;s:18:\"oauth_reg_linkedin\";i:0;s:11:\"lti_enabled\";i:0;}', 'a:14:{s:13:\"contact_email\";s:0:\"\";s:17:\"contact_link_text\";s:0:\"\";s:9:\"logo_file\";s:0:\"\";s:14:\"carousel_items\";s:0:\"\";s:11:\"html_header\";s:0:\"\";s:16:\"footer_copyright\";s:45:\"© 2015 Viddler Inc. All Rights Reserved.\";s:19:\"footer_privacy_link\";s:37:\"http://www.viddler.com/privacy-policy\";s:17:\"footer_terms_link\";s:35:\"http://www.viddler.com/terms-of-use\";s:14:\"help_link_text\";s:4:\"Help\";s:9:\"help_link\";s:0:\"\";s:7:\"color_1\";s:7:\"#ffffff\";s:7:\"color_2\";s:7:\"#2C333C\";s:7:\"color_3\";s:7:\"#2C333C\";s:7:\"color_4\";s:7:\"#60a1d7\";}') 
160404 9:30:25 30 Close stmt 
     21 Query ROLLBACK 
     21 Quit 
     22 Query ROLLBACK 
     22 Quit 
     23 Query ROLLBACK 
     23 Quit 
     24 Query ROLLBACK 
     24 Quit 
     25 Query ROLLBACK 
     25 Quit 
     26 Query ROLLBACK 
     26 Quit 
     27 Query ROLLBACK 
     27 Quit 
     28 Query ROLLBACK 
     28 Quit 
     29 Query ROLLBACK 
     29 Quit 
     30 Query ROLLBACK 
     30 Quit 
+0

क्वेरी लॉग सक्षम करें और देखें कि कौन से प्रश्न डेडलॉक का कारण बनते हैं। और आपको टाइमआउट को सामान्य स्तर पर वापस सेट करना चाहिए। – DanFromGermany

+0

यह समुदायों की तालिका में सम्मिलित है जो असफल रहा है। मैंने mysql क्वेरी लॉग से डेटा दिखाने के लिए ऊपर दिए गए प्रश्न को अद्यतन किया है। –

+1

अपने प्रश्न का उत्तर नहीं देते, मैं केवल परीक्षण के लिए स्क्लाइट पर जाने का सुझाव देता हूं। यह नाटकीय रूप से आपके परीक्षणों के रन टाइम को गति देगा। – Mysteryos

उत्तर

2

तो, लॉक प्रतीक्षा टाइमआउट बढ़ाना सबसे अच्छा अभ्यास नहीं है; the best practice is to catch the error and recover

दोनों गतिरोध और लॉक प्रतीक्षा समय समाप्ति व्यस्त सर्वर और पर सामान्य हैं यह है आवश्यक अनुप्रयोगों के बारे में पता है कि वे हो सकता है और उन्हें संभाल होने के लिए:

आधिकारिक तौर पर, यह तुम क्या कर किया जाना चाहिए पुनः प्रयास करके। आप एक लेनदेन के दौरान उन्हें कम आंकड़ों के पहला परिवर्तन के बीच संभव के रूप में थोड़ा काम के रूप में कार्य करके संभावना बना सकते हैं और प्रतिबद्ध, तो ताले कम से कम से कम समय के लिए और पंक्तियों की छोटी संभव संख्या के लिए आयोजित की जाती हैं । कभी-कभी विभिन्न लेनदेन के बीच विभाजन कार्य व्यावहारिक और सहायक हो सकता है।

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