Einzelnen Beitrag anzeigen
Alt 09.02.2010, 11:23  
Samhayne
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Oder auch nicht... grad mal bissl getestet.

Das scheint nicht zu stimmen:

Zitat:
Sendet ein Benutzer wirklich Millisekunden genau gleichzeitig eine Anfrage muss diese automatisch solange warten, bis mysql mit der Transaktion fertig ist. Erst dann wird Sie ausgeführt und liefert ein Ergebnis zurück.
Hab's mal mit autocommit = false getestet, was laut manual einer Transaction entspräche.
Gingst aber wahrscheinlich von einem Transactionquery in einem einzigen Block aus, an dessen Ende dann commited wird.


So verhält er sich jedoch wie man's von einem so benannten Modus erwarten würde.

Beide User bekommen Zugriff.... und sobald der erste user commited.... kriegt auch user 2 die neuen Daten. Davor kriegt er einfach die alten.


Ausgabe:

Code:
User 1 reads accesslock: open
User 1 queries autocommit status: 1
User 1 sets autocommit = false 
User 1 queries autocommit status: 0
User 1 sets Lock 
User 1 reads accesslock: locked
User 2 queries autocommit status: 1
User 2 reads accesslock: open
User 1 committed his changes. 
User 2 reads accesslock: locked
PHP-Code:
//set mysql connection vars manually
/*
define('DB_HOST', 'localhost');
define('DB_BENUTZER', 'username');
define('DB_PASSWORT', 'pass');
define('DB_NAME', 'db_name');
*/



$db1 mysqli_connect(DB_HOSTDB_BENUTZERDB_PASSWORTDB_NAME)
  or die (
"MySQL connect error" mysqli_error());

$db2 mysqli_connect(DB_HOSTDB_BENUTZERDB_PASSWORTDB_NAME)
  or die (
"MySQL connect error" mysqli_error());



function 
checkAutoCommitStatus($dbLink)
{
  
$sql "SELECT @@autocommit";
  
$result mysqli_query($dbLink$sql);
  
$row mysqli_fetch_row($result);
  
$bAC $row[0];

  return 
$bAC;
}


function 
setLock($dbLink$status)
{
  
$sql "UPDATE hayne_testtable
        SET accesslock = '$status'"
;

  
mysqli_query($dbLink$sql)
    or die (
"MySQL update error: " mysqli_error($dbLink));
}

function 
readLock($dbLink)
{
  
$sql "SELECT accesslock
        FROM hayne_testtable"
;

  
$result mysqli_query($dbLink$sql)
    or die (
"MySQL insert error: " mysqli_error($dbLink));
  
$daten mysqli_fetch_array($result);
  
$accesslock $daten["accesslock"];

  return 
$accesslock;
}


function 
buildTesttable()
{
  global 
$db;

  
//***** build testtable ******
  
$sql "
      CREATE TABLE IF NOT EXISTS `hayne_testtable` (
        `accesslock` varchar(20) NOT NULL DEFAULT 'open'
      ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3889 ;
      "
;

  
mysqli_query($db$sql)
      or die (
"MySQL connect error" mysqli_error());


  
$sql "INSERT INTO hayne_testtable (accesslock) VALUES ('open')";
  
mysqli_query($db$sql)
      or die (
"MySQL insert error" mysqli_error($db));
}






echo 
"========================================= <br />";

buildTesttable();



///////////////// ****** USER 1 ***** //////////////
echo "User 1 reads accesslock: " . (readLock($db1)) . "<br />";

echo 
"User 1 queries autocommit status: " . (checkAutoCommitStatus($db1)) . "<br />";

echo 
"User 1 sets autocommit = false <br />";
mysqli_autocommit($db1false);

echo 
"User 1 queries autocommit status: " . (checkAutoCommitStatus($db1)) . "<br />";

echo 
"User 1 sets Lock <br />";
setLock($db1'locked');

echo 
"User 1 reads accesslock: " . (readLock($db1)) . "<br />";

///////////////// ****** USER 2 ***** //////////////
echo "User 2 queries autocommit status: " . (checkAutoCommitStatus($db2)) . "<br />";

echo 
"User 2 reads accesslock: " . (readLock($db2)) . "<br />";

/////////////// ******* USER 1 commits ********//////////////
mysqli_commit($db1);
echo 
"User 1 committed his changes. <br />";

////// **** USER 2 reads accesslock **** /////
echo "User 2 reads accesslock: " . (readLock($db2)) . "<br />";





// clean up
mysqli_autocommit($db1true); 

$sql "DROP TABLE hayne_testtable";
mysqli_query($db1$sql)    
     or die (
"MySQL drop error: " mysqli_error($db1)); 

Geändert von Samhayne (09.02.2010 um 11:57 Uhr).
Samhayne ist offline   Mit Zitat antworten