2009-02-19 14 views
5

2 फ़ाइलें, "1.php" और "2.php" तैयार काम नहीं करता।SQLite लेनदेन के रूप में की उम्मीद

"1.php" इस तरह है।

<?php 
$dbh = new PDO('sqlite:test1'); 
$dbh->beginTransaction(); 

print "aaa<br>"; 
sleep(55); 
$dbh->commit(); 

print "bbb"; 
?> 

और "2.php" इस तरह है।

<?php 
$dbh = new PDO('sqlite:test1'); 
$dbh->beginTransaction(); 

print "ccc<br>"; 
$dbh->commit(); 
print "ddd"; 
?> 

और मैं "1.php" excute। यह एक लेनदेन शुरू करता है और 55 सेकंड इंतजार करता है।

तो जब मैं तुरंत "2.php" excute, मेरी उम्मीद यह है:

  1. "1.php" हो रही है लेन-देन और
  2. "1" एक डेटाबेस ताला रखती
  3. "2 "एक सौदे शुरू नहीं कर सकते
  4. " 2 "डेटाबेस ताला नहीं मिल सकता है तो
  5. " 2 "55 सेकंड
इंतजार करना

लेकिन, लेकिन परीक्षण एक और तरीका चला गया। जब मैं "2" excute, तो

  1. "2" तुरंत परिणाम
  2. "2" के लिए इंतजार नहीं किया

तो मुझे लगता है कि "1" लेन-देन नहीं मिल सका है है लौटे, या डेटाबेस लॉक नहीं मिल सका।

क्या कोई मदद कर सकता है?

उत्तर

9

मैं यह समझ के रूप में, SQLite लेनदेन जब तक

  • एक डेटाबेस ताला नहीं है। आप उन्हें EXCLUSIVE बनाने, या
  • ख (वे डिफ़ॉल्ट रूप से DEFERRED हैं)। आप वास्तव में डेटाबेस

का उपयोग तो या तो आप स्पष्ट रूप से

$dbh->exec("BEGIN EXCLUSIVE TRANSACTION"); 

आपको कॉल या DB करने के लिए एक लिखने आपरेशन (INSERT/UPDATE) बनाने से पहले आप sleep() लगते हैं।

documentation (जोर मेरा) का हवाला देते हैं करने के लिए:

लेनदेन आस्थगित किया जा सकता है, तत्काल, या विशेष। डिफ़ॉल्ट लेनदेन व्यवहार स्थगित कर दिया गया है। स्थगित मतलब है कि कोई ताले डेटाबेस पर हासिल कर ली हैं जब तक डेटाबेस पहले पहुँचा जा सकता है। एक आस्थगित लेनदेन के साथ इस प्रकार, BEGIN बयान खुद कुछ नहीं करता है। ताले पहले पढ़ने तक या ऑपरेशन लिखने तक अधिग्रहित नहीं किए जाते हैं।डेटाबेस के विरुद्ध पहला पढ़ने ऑपरेशन साझा लॉक बनाता है और पहला लिखें ऑपरेशन एक आरक्षित लॉक बनाता है।

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