मेरे एसएफ आवेदन पर, मेरे पास "नियमित" फॉर्म है (नियंत्रक में फॉर्म टाइप के साथ उत्पन्न)।

मान लें कि उपयोगकर्ता 1 फॉर्म ए को संपादित करता है और इसे भरने में कई मिनट लगते हैं। उस अवधि में, उपयोगकर्ता 2 फॉर्म ए को भी संपादित करता है। आप अनुमान लगा सकते हैं कि सबमिट करने वाला अंतिम उपयोगकर्ता जीत जाता है, और दूसरा वह सब खो देता है जो उसने भरा था।

मेरे द्वारा इसे होने से कैसे रोका जा सकता है? यह एकाधिक सबमिट (एक ही उपयोगकर्ता द्वारा) का मामला नहीं है।

मुझे नहीं पता कि यह संभव है और इसे सर्वोत्तम तरीके से कैसे कार्यान्वित किया जाए, लेकिन मेरा अनुमान कुछ "लॉक" तंत्र जोड़ना होगा।

मैंने पढ़ा है https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html#locking-support

क्या मेरे फॉर्म के लिए इकाई में किसी फ़ील्ड में @Version जोड़ना पर्याप्त होगा और एसएफ बाकी का ख्याल रखता है?

मैं चाहता हूं कि जब उपयोगकर्ता 2 फॉर्म को खोलने का प्रयास करता है, तो मैं संदेश भेज सकता हूं: "क्षमा करें, उपयोगकर्ता 1 पहले से ही फॉर्म भर रहा है"। मैं नहीं चाहता कि उपयोगकर्ता 2 वह सब कुछ खो देता है जो वह केवल तभी भरता है जब वह सबमिट करता है।

धन्यवाद।

1
Overdose 20 सितंबर 2018, 18:13

2 जवाब

सबसे बढ़िया उत्तर

आप जो हासिल करने की कोशिश कर रहे हैं वह ढांचे द्वारा बॉक्स से बाहर नहीं दिया गया है।

आप क्या कर सकते हैं लॉक कंपोनेंट का लाभ उठाएं या एक समान समाधान लागू करें अपने आप से।

// Symfony\Component\Lock\Factory $factory

$lock = $factory->createLock('your-amazing-form-USER-ID');

if (!$lock->acquire()) {
    // Sorry, user1 is already completing the form
    // throw exception or render a template for example
}

// Do what you need to show the form.

// Form is submitted and valid? Do what you need and release the lock.
if ($form->submited()) {
    // Save to database
    $lock->release();
}

लॉक को टीटीएल देना एक अच्छा विचार है ताकि यदि उपयोगकर्ता फॉर्म जमा नहीं करता है तो लॉक अभी भी जारी किया जाता है। चूंकि आप अभी भी चाहते हैं कि लॉक हासिल करने वाला उपयोगकर्ता फॉर्म जमा करने में सक्षम हो, तो संसाधन नाम में उदाहरण के लिए उपयोगकर्ता पहचानकर्ता होना चाहिए।

1
João Alves 20 सितंबर 2018, 19:45

आप, स्पष्ट रूप से, लॉक का उपयोग कर सकते हैं ताकि एक समय में केवल एक उपयोगकर्ता एक फॉर्म तक पहुंच सके, लेकिन जैसा कि एक टिप्पणी में कहा गया है, आपको सावधान रहना होगा कि आपके ताले जारी किए जाते हैं क्योंकि अन्यथा कोई भी उपयोगकर्ता 1 तक फॉर्म तक नहीं पहुंच सकता है। समाप्त हो गया है।

यह टाइमआउट मैकेनिज्म भी एक समस्या है क्योंकि यदि आप इसे बहुत छोटा सेट करते हैं, तो आप उसी समस्या में पड़ जाएंगे, और यदि यह बहुत लंबा सेट है, तो आपके उपयोगकर्ता फंस जाएंगे।

आप अभी भी एक छोटा लॉक सेट कर सकते हैं, और कुछ क्लाइंट साइड स्क्रिप्ट डाल सकते हैं जो लॉक समाप्त होने पर उपयोगकर्ता को चेतावनी देता है लेकिन इसके लिए और अधिक काम की आवश्यकता होती है।

दूसरी ओर आप एक ऐसी व्यवस्था पर विचार कर सकते हैं जहां आप सभी उपयोगकर्ताओं को फ़ॉर्म तक पहुंचने की अनुमति देते हैं, और जहां सबमिट करने वाले पहले व्यक्ति का डेटा सहेजा जाता है, और बाद में उसे एक संदेश मिलता है कि डेटा को बीच में अपडेट कर दिया गया है। यह एक @Version द्वारा प्राप्त नहीं किया जा सकता है, जैसा कि आप खोज रहे थे, लेकिन केवल एक update date फ़ील्ड जोड़कर।

इस फ़ील्ड के साथ, आप बस इस update date को एक छिपे हुए फ़ील्ड के रूप में जोड़ते हैं और जब कोई उपयोगकर्ता फ़ॉर्म सबमिट करता है, तो आप सबमिट किए गए फ़ील्ड के मान की तुलना निकाय के एक से करते हैं और यदि दो मान मेल नहीं खाते हैं, तो आप बाद के उपयोगकर्ताओं को इस तथ्य के बारे में चेतावनी दें कि इकाई को बीच में अपडेट किया गया है।

0
Clorr 16 मार्च 2021, 12:24