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

Zitat:
Zitat von thomas_w Beitrag anzeigen
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

Zitat:
Schau die mal

PHP: mysqli::autocommit - Manual
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)); 
Samhayne ist offline   Mit Zitat antworten