मेरे पास टेस्ट क्लास पर एक विधि में बहुत छोटा डेटासेट उत्पन्न होता है, मैंने 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
क्वेरी लॉग सक्षम करें और देखें कि कौन से प्रश्न डेडलॉक का कारण बनते हैं। और आपको टाइमआउट को सामान्य स्तर पर वापस सेट करना चाहिए। – DanFromGermany
यह समुदायों की तालिका में सम्मिलित है जो असफल रहा है। मैंने mysql क्वेरी लॉग से डेटा दिखाने के लिए ऊपर दिए गए प्रश्न को अद्यतन किया है। –
अपने प्रश्न का उत्तर नहीं देते, मैं केवल परीक्षण के लिए स्क्लाइट पर जाने का सुझाव देता हूं। यह नाटकीय रूप से आपके परीक्षणों के रन टाइम को गति देगा। – Mysteryos