Zitat:
Zitat von thomas_w ich bin mir nicht sicher, ob das Autocommit mit "SELECT @@autocommit"; deaktiviert wird. |
Nene... auch wenn ich den Select mehrfach ausführe, ändert sich nix.
Code:
User 1 queries autocommit status: 1
User 1 queries autocommit status: 1
User 1 queries autocommit status: 1
User 1 sets autocommit = false
User 1 queries autocommit status: 0
User 1 queries autocommit status: 0
User 1 queries autocommit status: 0
Natürlich schon reingeguckt.
Momentan bin ich wieder zurück bei der Idee, das Lock so zu lösen:
UPDATE: wenn 'open' setz meine User ID rein,
ansonsten lass es so, wie es ist.
PHP-Code:
function setLockV2($dbLink, $user)
{
$sql = "UPDATE hayne_testtable
SET accesslock = (CASE accesslock
WHEN 'open' THEN 'locked by user $user'
ELSE accesslock
END)
";
mysqli_query($dbLink, $sql)
or die ("MySQL UPDATE error: " . mysqli_error($dbLink));
}
Anschließend nochmal SELECT Abfrage, ob meine User ID gesetzt ist,
wenn ja... fang an zu arbeiten,
wenn nicht... 'ne halbe Sekunde Pause und nochmal.
Dazu dann eben noch ein 60 Sekunden Timeout, der das Lock mit Gewalt "aufreisst" bzw. noch zusätzlich ein Timestamp in der Tabelle.
Hmhm... 'n bißchen frickelig.
Aber funktionieren tut's.
Ausgabe:
Code:
======================================
User 1 tries to access...
======================================
successfully locked by user 1. Doing work...
======================================
User 2 tries to access...
======================================
No access! locked by user 1
PHP-Code:
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));
}
function setLockV2($dbLink, $user)
{
$sql = "UPDATE hayne_testtable
SET accesslock = (CASE accesslock
WHEN 'open' THEN 'locked by user $user'
ELSE accesslock
END)
";
mysqli_query($dbLink, $sql)
or die ("MySQL UPDATE error: " . mysqli_error($dbLink));
}
echo "====================================== <br />";
buildTesttable();
$user = 1;
echo "====================================== <br />";
echo "User $user tries to access... <br />";
echo "====================================== <br />";
setLockV2($db1, $user);
$lock = readLock($db1);
if ($lock == "locked by user $user")
{
echo "successfully locked by user $user. Doing work...<br />";
//do stuff
//[...]
//setLock($db1, "open"); echo "Lock opened. <br />";
}
else echo "No access! $lock <br />";
$user = 2;
echo "====================================== <br />";
echo "User $user tries to access... <br />";
echo "====================================== <br />";
setLockV2($db1, $user);
$lock = readLock($db2);
if ($lock == "locked by user $user")
{
echo "successfully locked by user $user. Doing work...<br />";
//do stuff
//[...]
setLock($db1, "open"); echo "Lock opened. <br />";
}
else echo "No access! $lock <br />";
// clean up
$sql = "DROP TABLE hayne_testtable";
mysqli_query($db, $sql) or die ("MySQL drop error: " . mysqli_error($db));