2011-10-01 10 views
5

ज़ेंड फ्रेमवर्क का उपयोग करके, मुझे (1) एक MySQL डेटाबेस से एक रिकॉर्ड पढ़ने की आवश्यकता है, और (2) तुरंत उस रिकॉर्ड पर वापस लिखने के लिए यह इंगित करने के लिए कि इसे पढ़ा गया है। मैं अन्य प्रक्रियाओं या प्रश्नों को चरण (1) और (2) के बीच एक ही रिकॉर्ड में पढ़ने या लिखने में सक्षम नहीं होना चाहता हूं।ज़ेंड फ्रेमवर्क में डेटाबेस लेनदेन: क्या वे अलग हैं?

मैंने यह चरण के लिए लेन-देन का उपयोग कर विचार कर रहा था। यदि मैं निम्नलिखित विधियों का उपयोग करता हूं, तो क्या यह मेरी आवश्यकताओं को पूरा करेगा?

Zend_Db_Adapter_Abstract::beginTransaction() 
Zend_Db_Adapter_Abstract::commit() 
Zend_Db_Adapter_Abstract::rollBack() 

उत्तर

10

आप टेबल है कि आप पर लेन-देन के लिए जारी करेगा InnoDB engine उपयोग कर रहे हैं presupposing:

तो आवश्यकता है कि आप पहली बार, पंक्ति पढ़ सकते हैं और विशेष रूप से ताला यह करने की जरूरत है इससे पहले कि आप इसे अद्यतन करने जा रहे हैं , आपको SELECT ... FOR UPDATE क्वेरी जारी करनी चाहिए। की तरह कुछ:

$db->beginTransaction(); 
try 
{ 
    $select = $db->select() 
       ->forUpdate() // <-- here's the magic 
       ->from(
        array('a' => 'yourTable'), 
        array('your', 'column', 'names') 
       ) 
       ->where('someColumn = ?', $whatever); 

    $result = $this->_adapter->fetchRow($select); 

    /* 
     alter data in $result 
     and update if necessary: 
    */ 
    $db->update('yourTable', $result, array('someColumn = ?' => $whatever)); 

    $db->commit(); 
} 
catch(Exception $e) 
{ 
    $db->rollBack(); 
} 

या बस जारी 'कच्चे' SELECT ... FOR UPDATE और UPDATE एसक्यूएल निश्चित रूप से $db पर बयान।

+0

अद्यतन को The महत्वपूर्ण है। मेरे पास एक कतार लागू करने की एक समान स्थिति थी। पारितोषिक के लिए धन्यवाद। – cr125rider

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