php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 04-08-2007, 11:48
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard sql php start transaction

hallo bin noch ziemlich neu und habe ein problem

hab zunächst in der datei xampp\mysql\bin\my.cnf
folgendes editiert
# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = C:/Program Files/xampp/mysql/data/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = C:/Program Files/xampp/mysql/data/
innodb_log_arch_dir = C:/Program Files/xampp/mysql/data/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
set-variable = innodb_buffer_pool_size=16M
set-variable = innodb_additional_mem_pool_size=2M
# Set .._log_file_size to 25 % of buffer pool size
set-variable = innodb_log_file_size=5M
set-variable = innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1
set-variable = innodb_lock_wait_timeout=50

um eine innobDB zu erhalten um transactionen ausführen zu könne.
habe ich das so richtig gemacht? oder war das garnicht nötig?

nun zum hauptproblem
in php
PHP-Code:
<?php
session_start
();
require_once(
'datenbankverbindung.php');
$id $_POST['transmit'];

$sql=db_connect();

$result=sql->query("START TRANSACTION");

//$result=sql->query("SELECT id FROM WHERE id='$id' FOR UPDATE NOWAIT");
//$angebot=$result->fetch_assoc();

//if($angebot['belegt']==1)
//    echo("belegt");
//else
//$result=sql->query("UPDATE angebote SET belegt=1 WHERE id='$id'");  
//$result=sql->query("COMMIT");


?>


hier kommt schon der erste Fehler
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in C:\Program Files\xampp\htdocs\angebotVeraendern.php on line 8
also in der transactions anweisung.

kann mir jemand vielleicht bitte sagen wie ich es richtig machen kann?
Mit Zitat antworten
  #2 (permalink)  
Alt 04-08-2007, 12:12
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Wahrscheinlich gibt die Funktion db_connect() kein Object zurück sondern z.B. false weil der DB-Server nicht erreichbar ist. Damit ist $sql kein Object und du kannst nicht $sql->irgendwas verwenden!
Mit Zitat antworten
  #3 (permalink)  
Alt 04-08-2007, 15:45
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Smile

ne die verbindung funktioniert, aber du hast recht. in meinem code steht kein $ vor sql und somit verwende ich kein objekt. *g*
oh mann!

noch eine frage mit der restlichen code verhindere ich damit dirty ready von wenn jemand anderes diese zeile ausführt?

PHP-Code:
$result=sql->query("SELECT id FROM WHERE id='$id' FOR UPDATE NOWAIT"); 

ausserdem diese abfrage SELECT id FROM WHERE id='$id' FOR UPDATE NOWAIT funktioniert noch nicht ganz was habe ich da syntaktisch falsch geschrieben?

habe diesen befehl von hier http://dev.mysql.com/doc/refman/5.1/...ing-reads.html

Geändert von Xadine (04-08-2007 um 16:02 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 04-08-2007, 16:00
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Keine Angst, der andere wird dir nicht reinpfuschen. Denn auch hier fehlt wieder das $-Zeichen und ein Tabellenname.

Mal im Ernst: Was macht FOR UPDATE NOWAIT bei MySQL? Ich kenne es nur so, dass es eben nicht wartet bis ein gesperrter Datensatz freigegeben wird sondern sofort mit einer Fehlermeldung abbricht.
Und da Locks auf Datensatzebene nicht Benutzerbezogen sind, ist es auch egal wer dieses SELECT ausführt.

Geändert von onemorenerd (04-08-2007 um 16:03 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 04-08-2007, 16:12
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hm ich habs irgendwo mal gelesen mit dem NOWAIT

ok,
und was meinst du mit
Zitat:
Und da Locks auf Datensatzebene nicht Benutzerbezogen sind, ist es auch egal wer dieses SELECT ausführt.
wenn ein benutzer A auf einen button klickt soll er in einer zeile den wert von id auf 1 setzen und dabei diesezeile sperren, damit Benutzer B eine fehler meldung bekommt wenn er gleichzeitig diesen button klickt.

gibt es ein szenario wenn zb 100 benutzer "gleichzeitig" den button klicken
das vielleicht 2 Benutzeranfragen diese Zeile sperren ?
Mit Zitat antworten
  #6 (permalink)  
Alt 04-08-2007, 16:33
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von Xadine
gibt es ein szenario wenn zb 100 benutzer "gleichzeitig" den button klicken
das vielleicht 2 Benutzeranfragen diese Zeile sperren?
Es kann gleichzeitig viele Read Locks geben, aber nur ein eXclusive Lock. Wenn ein DBMS gleichzeitig mehrere X-Locks zuläßt, dann ist das ein Bug, denn damit ist Locking völlig sinnlos.
Wie du merkst, beziehe ich mich nicht speziell auf MySQL. Bitte selbst testen, wenn es geschäftskritisch ist!
Mit Zitat antworten
  #7 (permalink)  
Alt 04-08-2007, 16:46
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ja ok werde es noch testen, erst morgen abend wieder.

Dennoch einer frage noch, wie kriege ich einen exklusiven lock hin?
oder ist das schon einer in meiner abfrage?
ich will nicht das andere benutzer auch das gleiche lesen(select) wie der erste der den lock gemacht hat.
Mit Zitat antworten
  #8 (permalink)  
Alt 04-08-2007, 17:01
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Exclusive Locks sind für Schreiboperationen gedacht. Du machst aber nur ein SELECT. Es kann also auch parallel noch ein anderer lesen.
Aber erklär mal bitte, warum du das verhindern willst. Dirty Read ist das nämlich sowieso nicht, denn dein SELECT macht die Daten nicht "dirty".
Mit Zitat antworten
  #9 (permalink)  
Alt 04-08-2007, 17:33
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wo genau steht eigentlich, was NOWAIT macht - und vor allem, dass MySQL das überhaupt könnte?
Ich finde nämlich dazu rein gar nichts im Manual...

Was hingegen "FOR UPDATE" bringt oder nicht bringt, wird genau erläutert
Zitat:
If you use FOR UPDATE with a storage engine that uses page or row locks, rows examined by the query are write-locked until the end of the current transaction. Using LOCK IN SHARE MODE sets a shared lock that allows other transactions to read the examined rows but not to update or delete them.
genauso wie deine Fragen mit dem Absatz beantwortet werden sollten.
Mit Zitat antworten
  #10 (permalink)  
Alt 04-08-2007, 19:08
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von onemorenerd
Exclusive Locks sind für Schreiboperationen gedacht. Du machst aber nur ein SELECT. Es kann also auch parallel noch ein anderer lesen.
Aber erklär mal bitte, warum du das verhindern willst. Dirty Read ist das nämlich sowieso nicht, denn dein SELECT macht die Daten nicht "dirty".
es wird doch ein update gemacht, und wenn zwei clienten selecten und einer updatet dann hat der andere doch ein "dirty read" weil das was er soeben selectet hat nicht mehr aktuel ist.

mit welchen schema macht mann den sowas? transaction und lock mässig?
Mit Zitat antworten
  #11 (permalink)  
Alt 04-08-2007, 19:11
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ghostgambler
Wo genau steht eigentlich, was NOWAIT macht - und vor allem, dass MySQL das überhaupt könnte?
Ich finde nämlich dazu rein gar nichts im Manual...

Was hingegen "FOR UPDATE" bringt oder nicht bringt, wird genau erläutert

genauso wie deine Fragen mit dem Absatz beantwortet werden sollten.
das mit dem waitfor hab ich aus irgendeiner seite mal aufgegriffn und wollte es einfach ausprobieren. im manual steht es nicht haste recht.

ist es also so das wenn einer for update macht dass dann keine mehr selecten kann?

auch wenn dieses select for update gleichzeitig passiert?

danke euch allen
viele grüsse
xadine
Mit Zitat antworten
  #12 (permalink)  
Alt 04-08-2007, 19:42
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Xadine
ist es also so das wenn einer for update macht dass dann keine mehr selecten kann?
Ja, steht doch da...

Zitat:
auch wenn dieses select for update gleichzeitig passiert?
Es können nicht zwei gleichzeitig abgesetzt werden... das erste akquiriert ein Write-Lock, danach ist der Datensatz gesperrt.

Das gilt natürlich nur, wenn die Storage-Engine das auch unterstützt.
Mit Zitat antworten
  #13 (permalink)  
Alt 04-08-2007, 20:35
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ghostgambler
Wo genau steht eigentlich, was NOWAIT macht - und vor allem, dass MySQL das überhaupt könnte?
Ich finde nämlich dazu rein gar nichts im Manual...

Was hingegen "FOR UPDATE" bringt oder nicht bringt, wird genau erläutert

genauso wie deine Fragen mit dem Absatz beantwortet werden sollten.
das mit dem waitfor hab ich aus irgendeiner seite mal aufgegriffn und wollte es einfach ausprobieren. im manual steht es nicht haste recht.

ist es also so das wenn einer for update macht dass dann keine mehr selecten kann?

auch wenn dieses select for update gleichzeitig passiert?

danke euch allen
viele grüsse
xadine
Mit Zitat antworten
  #14 (permalink)  
Alt 05-08-2007, 23:56
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hallo ichkomme wieder nicht weiter,
wollte testen ob wirklich gespeert wird.

PHP-Code:
<?php
session_start
();
require_once(
'datenbankverbindung.php');

$id $_POST['transmit'];

$sql=db_connect();



$result=$sql->query("START TRANSACTION");

$result=$sql->query("SELECT * FROM angebot WHERE id='$id' FOR UPDATE");
if(!
$result)
echo(
"gesperrt");
else
echo(
"nicht gesperrt");
ich commite nicht damit ich mit nem anderen rechner die selbe anfrage starten kann. aber nach dem benutzer A nicht gespeert ausgibt gibt benutzer B das selbe auch aus.
Ich habe die Ahnung das es daran liegt das das skript zuende läuft und somit die zeile entsperrt wird? ist das so?
weiss auch nicht wie ich die transaction "halten" soll um ein gleichzeitiges select zu simulieren.


könnt ihr mir nochmal helfen?
viele grüsse
Xadine
Mit Zitat antworten
  #15 (permalink)  
Alt 06-08-2007, 00:10
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Ja das ist so und sleep() hilft dagegen.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:16 Uhr.