2012-12-12 13 views
16

ZF1 Zend_Db संदर्भ पुस्तिका में लेनदेन करने पर entire section है।जेडएफ 2 नियंत्रण लेनदेन में ज़ेंड डीबी कैसे करता है?

ZF2 Zend\Db reference manual लेनदेन पर किसी भी दस्तावेज की कमी है।

मैं ZF2 में लेनदेन कैसे कर सकता हूं? उदाहरण कोड सहायक होगा।

उत्तर

21

गायब दस्तावेज उत्सुक है।

यह पता लगाने के लिए कि मुझे क्या हुआ, मुझे ज़ेंड \ डीबी \ एडाप्टर के लिए API docs में गोता लगा देना पड़ा।

ऐसा लगता है कि beginTransaction, rollback और commitZend\Db\Adapter\Driver\ConnectionInterface में परिभाषित हैं। इसका मतलब है कि वे प्रत्येक एडाप्टर कनेक्शन पर कॉल करने योग्य तरीके हैं। दुर्भाग्य से कनेक्शन खुद को दफनाया जाता है।

जो मैं स्पष्ट नहीं हूं - और इस समय के लिए एक उदाहरण प्रदान नहीं कर सकता - यह पता लगा रहा है कि आप वास्तव में इन तरीकों को किस ऑब्जेक्ट पर कॉल करते हैं। सबसे बुरे मामले में, ऐसा लगता है कि आप $adapter->getDriver()->getConnection()->beginTransaction() पर कॉल करना चाहेंगे।

ई।

मैं किसी और को अधिक ज्ञान के साथ उम्मीद कर रहा हूं, और ZF2 आसान की एक प्रति, यह देखेगा और एक बेहतर विकल्प प्रदान करेगा।

भूल जाते हैं कि तुम सिर्फ BEGIN TRANSACTION/ROLLBACK/COMMIT/SET autocommit=... SQL कथन अपने आप को जारी कर सकते हैं मत करो। यह शायद ठीक है, क्योंकि ऐसा लगता है कि ज़ेंड \ Db लेनदेन स्थिति का ट्रैक रखता है।

+0

बहुत धन्यवाद चार्ल्स - मुझे एपीआई के माध्यम से सावधानी से पढ़ना होगा और सीधे इसे जारी करने के लिए अपने अंतिम बिंदु पर पीडीओ के माध्यम से काम करना होगा। –

35

आपको यह मिल गया है। , शुरू करने के लिए उचित तरीके से प्रतिबद्ध है, और रोलबैक लेनदेन इस प्रकार है:

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); 

$this->getAdapter()->getDriver()->getConnection()->commit(); 

$this->getAdapter()->getDriver()->getConnection()->rollback(); 

बस इस बाहर वहाँ डाल करने के लिए भी आप भी अंतिम द्वारा बनाई गई आईडी प्राप्त कर सकते हैं:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue() 

आप उपयोग कर रहे हैं pgSQL आप अंत में बनाए गए आईडी लौटने के लिए अनुक्रम जोड़ने की आवश्यकता होगी:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq') 
+2

धन्यवाद @Diemuzi - यह वास्तव में उपयोगी है। –

+0

यह महान, अच्छी तरह से समझाया गया, बहुत धन्यवाद !! ZF2 और ZF3 के दस्तावेज़ इस भाग के बारे में स्पष्ट नहीं हैं! – evilReiko

8

लेन-देन करने के लिए दो बात कर रहे हैं।
1 - माईसाम एक लेनदेन इंजन नहीं है, इसलिए टेबल इंजन को InnoDB में बदलें।
2 - लेनदेन क्वेरी ("START TRANSACTION;" या "ROLLBACK;") कनेक्शन अन्य प्रश्नों (सम्मिलित या अद्यतन) के साथ होना चाहिए।
ZF2 में ऐसा करने के लिए आपको वर्तमान डीबी एडाप्टर प्राप्त करना चाहिए और सभी प्रश्नों में इसका उपयोग करना चाहिए।

इस कोड सही ढंग से काम नहीं करेगा:

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); 
    //do some jobs - e.g : multiple tables update or insert. 
    $this->getAdapter()->getDriver()->getConnection()->rollback(); 

$this->getAdapter()->getDriver()->getConnection() चूंकि नए डाटाबेस कनेक्शन बनाता है।

निम्नलिखित बजाय कोड का उपयोग करें:

$connection = $this->getAdapter()->getDriver()->getConnection(); 
    $connection->beginTransaction(); 
    //do some jobs - e.g : multiple tables update or insert. 
    $connection->rollback(); 

जांच के लिए अगर आपका कनेक्शन सही है, बस mysql में क्वेरी लॉग सक्षम करें।
क्वेरी चलाने के बाद आप mysql लॉग में प्रत्येक क्वेरी से पहले कनेक्शन नंबर देखेंगे। यह सभी लेनदेन प्रश्नों में समान होना चाहिए।

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