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_HOST, DB_BENUTZER, DB_PASSWORT, DB_NAME)
or die ("MySQL connect error" . mysqli_error());
$db2 = mysqli_connect(DB_HOST, DB_BENUTZER, DB_PASSWORT, DB_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($db1, false);
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($db1, true);
$sql = "DROP TABLE hayne_testtable";
mysqli_query($db1, $sql)
or die ("MySQL drop error: " . mysqli_error($db1));