MySQL

2015-11-25 3 views
14

में UnCommitted डेटा प्राप्त करें SQL Server में हम SQL Queries नीचे डेटाबेस में अनधिकृत डेटा प्राप्त करने के लिए लिख सकते हैं। इसका मतलब है कि अभी भी लेनदेन और लेनदेन के तहत डेटा पूरा नहीं हुआ है।MySQL

एसक्यूएल सर्वर क्वेरी

Select * from TableName With(NoLock); 

वहाँ MySQL डेटाबेस में किसी भी तुल्यता है मिल डेटा भले ही तालिका लॉक किया गया हो? मैं इसे PHP कोडइग्निटर

+0

डाटाबेस संपर्क – Pankaj

+0

के लिए PHP और MySQL के रूप में नमूना कोड की आवश्यकता है यह देखने के इस http कर सकते हैं।कॉम/प्रश्न/917640/किसी भी तरह से चयन-बिना-कारण-लॉकिंग-इन-माइस्क्ल – Linus

उत्तर

1

केवल इनओडीबी स्टोरेज इंजन लेनदेन का समर्थन करता है। यह ओरेकल/पोस्टग्रेएसक्यूएल-शैली एमवीसीसी को भी लागू करता है जो अंतर्निहित पंक्ति ताले को पढ़ने को अवरुद्ध करने से रोकता है। इनो डीबी में रीड-अनमेटेड प्राप्त करने के लिए, क्वेरी जारी करने से पहले SET TRANSACTION LEVEL READ UNCOMMITTED जारी करें।

PHP में ऐसा करने से कुछ इस तरह दिखाई देगा वाक्य रचना:

$dbh->exec('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'); 
$dbh->beginTransaction(); 

यह अगले COMMIT या ROLLBACK जब तक अलगाव स्तर निर्धारित करता है। सत्र की अवधि के लिए स्तर परिवर्तन जारी रखने के लिए,

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

का उपयोग करें।

किसी तालिका या पंक्ति पर एक गैर-साझाकरण पढ़ने वाले लॉक को ओवरराइड करने के लिए, मुझे यकीन नहीं है कि यह संभव है, और न ही मैं ऐसी स्थिति के बारे में सोच सकता हूं जहां यह वांछनीय होगा। गैर-साझाकरण ताले आमतौर पर किसी कारण से साझा नहीं होते हैं।

+1

डेटाबेस इंटरैक्शन – Pankaj

+0

के लिए PHP और MySQL के रूप में नमूना कोड की आवश्यकता है MyISAM में कोई लेनदेन जागरूकता नहीं है। कोई 'प्रतिबद्ध' नहीं है। क्वेरी समाप्त होने तक पूरी तालिका लॉक हो जाती है, इसलिए 'असामान्य' डेटा देखने का कोई तरीका नहीं है। –

1

चयन विवरण नॉनलॉकिंग फैशन में किए जाते हैं, लेकिन एक पंक्ति के संभावित पहले संस्करण का उपयोग किया जा सकता है। इस प्रकार, इस अलगाव स्तर का उपयोग करके, इस तरह के पढ़ने लगातार नहीं हैं। इसे एक गंदे पढ़ने भी कहा जाता है। अन्यथा, यह अलगाव स्तर काम करता है जैसे रीड कमेटेड।

serializable

यह स्तर repeatable पढ़ें तरह है, लेकिन InnoDB परोक्ष सभी सादे SELECT स्टेटमेंट्स धर्मान्तरित चयन करने के लिए ... SHARE मोड में लॉक करता है, तो autocommit अक्षम है। यदि ऑटोकॉमिट सक्षम है, तो SELECT इसका अपना लेनदेन है। इसलिए इसे केवल पढ़ने के लिए जाना जाता है और एक निरंतर (nonlocking) के रूप में प्रदर्शन किए जाने पर serialized किया जा सकता है और अन्य लेनदेन के लिए ब्लॉक की जरूरत नहीं है। (एक सादे ब्लॉक करने के लिए चुनते हैं, तो अन्य लेनदेन चयनित पंक्तियों अक्षम autocommit संशोधित किया है, बाध्य करने के लिए।)

autocommit

Command-Line Format --autocommit[=#] 
System Variable Name autocommit 
Variable Scope Global, Session 
Dynamic Variable Yes 
Permitted Values Type boolean 
Default ON 

autocommit मोड। यदि 1 पर सेट किया गया है, तो तालिका में सभी परिवर्तन तुरंत प्रभावी हो जाते हैं। यदि 0 पर सेट किया गया है, तो आपको इसे रद्द करने के लिए लेनदेन या रोलबैक स्वीकार करने के लिए COMMIT का उपयोग करना होगा। यदि autocommit 0 है और आप इसे 1 में बदलते हैं, तो MySQL किसी भी खुले लेनदेन की स्वचालित COMMIT करता है। एक लेनदेन शुरू करने का एक और तरीका स्टार्ट ट्रांज़ेक्शन या BEGIN कथन का उपयोग करना है। Section 13.3.1, “START TRANSACTION, COMMIT, and ROLLBACK Syntax” देखें।

डिफ़ॉल्ट रूप से, क्लाइंट कनेक्शन ऑटोकॉमिट सेट से शुरू होते हैं 1. ग्राहकों को 0 के डिफ़ॉल्ट से शुरू करने के कारण, सर्वर को --autocommit = 0 विकल्प के साथ प्रारंभ करके वैश्विक ऑटोोकॉमिट मान सेट करें।एक विकल्प फ़ाइल का उपयोग कर चर सेट करने के लिए, इन पंक्तियों में शामिल हैं:

[mysqld] 
autocommit=0 

See This also

+0

डेटाबेस इंटरैक्शन – Pankaj

+0

के लिए PHP और MySQL के रूप में नमूना कोड की आवश्यकता है, मुझे लगता है कि जब तक आप इसे प्रतिबद्ध नहीं करते हैं तब तक आपके php के साथ कोई भी चीज़ अनचाहे होगी। –

1

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

$this->db->simple_query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); 

आप MySQL isolation level in the documentation के बारे में अधिक जानकारी प्राप्त कर सकते हैं। इसके लिए innoDB टेबल की आवश्यकता है।

simple_query() के बारे में अधिक जानकारी के लिए codeigniter documentation के अनुसार, यह तब उपयोग किया जाता है जब कोई क्वेरी कोई परिणाम नहीं देती है।

+0

डेटाबेस इंटरैक्शन – Pankaj

+0

@Helper के लिए PHP और MySQL के रूप में नमूना कोड की आवश्यकता है यह पहले से ही PHP और MySQL है। यदि आपकी समस्या कोडनिर्देशक से संबंधित नहीं है, तो आपको '$ this-> db-> simple_query()' के बजाय 'mysqli_query()' का उपयोग करना होगा। – Adam

9

मिले शीर्षक के साथ एक लेख "MySQL NOLOCK वाक्य रचना" (NOLOCK) के साथ

http://itecsoftware.com/with-nolock-table-hint-equivalent-for-mysql

एसक्यूएल सर्वर इस तरह दिखता है:

SELECT * FROM TABLE_NAME WITH (nolock) 

MySQL के साथ एक ही लक्ष्य को हासिल करने के लिए हमें SET SESSION कमांड का उपयोग कर सत्र अलगाव मोड बदलें।

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM TABLE_NAME ; 
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; 

आप नीचे दिए गए भी द्वारा एक ही हासिल कर सकते हैं:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM TABLE_NAME ; 
COMMIT ; 

इस कथन से (NOLOCK) यानी READ UNCOMMITTED डेटा के लिए इसी तरह काम करेंगे। हम यह भी विश्व स्तर पर सभी कनेक्शनों के लिए अलगाव स्तर सेट कर सकते हैं:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

इसके अलावा, अलगाव भी स्तर से संबंधित दो प्रणाली चर MySQL सर्वर में मौजूद है:

SELECT @@global.tx_isolation; (global isolation level) 
SELECT @@tx_isolation; (session isolation level) 

या किसी लेन-देन के अंदर अलगाव स्तर सेट :

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
GO 

कोड आग लगनेवाला में आप पहले दो समाधान के साथ आपकी क्वेरी लपेट सकते हैं या आप वैश्विक विकल्प का उपयोग कर सकते हैं।

आपके संदर्भ आप नीचे दिए गए कोड का उपयोग कर सकते के लिए

:

$this->db->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE"); 
$this->db->trans_start(); 

// your code 

$this->db->trans_complete(); 

अद्यतन 1:

इससे पहले कि आप अपने बयानों को चलाने तुम बस एक प्रश्न में अलगाव स्तर सेट कर सकते हैं। // stackoverflow: नीचे सरल php mysqli कोड tu का उपयोग isolation level read uncommited

//db connection 
$mysqli = new mysqli('localhost', 'user', 'pass', 'db'); 

//set isolation level 
$mysqli->query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); 

//your Select Query 
$results = $mysqli->query("SELECT * FROM tablename"); 


while($row = $results->fetch_assoc()) { 
    //some statements 
} 

// Frees the memory associated with a result 
$results->free(); 
$mysqli->query("COMMIT"); 
// close connection 
$mysqli->close(); 
+0

डेटाबेस इंटरैक्शन – Pankaj

+0

@Helper के लिए PHP और MySQL के रूप में नमूना कोड की आवश्यकता है इसके लिए नमूना PHP कोड देखें –

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