AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Transaction?

Ein Thema von HomerGER · begonnen am 6. Jul 2005 · letzter Beitrag vom 6. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#1

Transaction?

  Alt 6. Jul 2005, 13:05
Datenbank: MSSQl • Zugriff über: OleDb
Hallo
meine SP in der DB sieht so aus
Delphi-Quellcode:
CREATE PROCEDURE GFC_M_INSERT
   @GFC_M_ID int output,
   @GFC_M_NAME nvarchar(100),
   @GFC_M_AKTIV bit,
   @GFC_M_OUT bit,
   @GFC_M_USER_NAME nvarchar(50),
   @GFC_M_USER_TXT ntext,
   @GFC_M_USER_DATE smalldatetime
AS
SET NOCOUNT ON

INSERT INTO [GFC_Medien]
(
         [GFC_M_NAME],
         [GFC_M_AKTIV],
         [GFC_M_OUT],
         [GFC_M_USER_NAME],
         [GFC_M_USER_TXT],
         [GFC_M_USER_DATE]
)
VALUES
(
         @GFC_M_NAME,
         @GFC_M_AKTIV,
         @GFC_M_OUT,
         @GFC_M_USER_NAME,
         @GFC_M_USER_TXT,
         @GFC_M_USER_DATE
)

SET @GFC_M_ID = @@IDENTITY
GO
meine Insert anweisung in Delphi
Delphi-Quellcode:
//Insert
  //Insert Command
  ins_cmd := OleDbCommand.Create();
  ins_cmd.CommandType := CommandType.StoredProcedure;
  ins_cmd.CommandText := 'GFC_M_INSERT';
  ins_cmd.Connection := gf_conn;

  ins_cmd.Parameters.Clear;
  ins_cmd.Parameters.Add('@GFC_M_NAME', OleDbType.VarWChar, 100, 'GFC_M_NAME');
  ins_cmd.Parameters.Add('@GFC_M_AKTIV', OleDbType.Boolean, 1, 'GFC_M_AKTIV');
  ins_cmd.Parameters.Add('@GFC_M_OUT', OleDbType.Boolean, 1, 'GFC_M_OUT');
  ins_cmd.Parameters.Add('@GFC_M_USER_NAME', OleDbType.VarWChar, 50, 'GFC_M_USER_NAME');
  ins_cmd.Parameters.Add('@GFC_M_USER_TXT', OleDbType.LongVarWChar, 16, 'GFC_M_USER_TXT');
  ins_cmd.Parameters.Add('@GFC_M_USER_DATE', OleDbType.DBTimeStamp, 4, 'GFC_M_USER_DATE');

  ins_par := ins_cmd.Parameters.Add('@Identity', OleDbType.Integer, 4, 'ID');
  ins_par.Direction := System.Data.ParameterDirection.Output;
  ins_par.SourceColumn := 'ID';
  ins_par.SourceVersion := DataRowVersion.Current;
wie kann ich jetzt sicher sein das meine Daten auch eingetragen werden (Stromausfall)
mit Transaction? aber wie und WO?
Wann setze ich ein Commit und wann ein Rollback?

Homer
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Transaction?

  Alt 6. Jul 2005, 13:26
Commit : speichern in DB

Rollback : alles rückgängig machen, was seit dem Start der Transaction an der Datenbank geändert wurde.

Wichtig ist also im Prinzip nur, wann und durch welche Aktion die Transaktion gestartet wurde. Ich habe z.B. 2 Buttons "speichern" und "Eingaben stornieren". Beim ersten steckt ein Commit dahinter, bei dem anderen ein Rollback.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#3

Re: Transaction?

  Alt 6. Jul 2005, 14:34
@Hansa
Du machst es manuel (Button)

ich wollte es automatischen machen

Keine Fehler Commit
Fehler (Stromausfall) Rollback

Ich wollte es irgendwie in die SP einbauen

der hintergrund ist
wenn du in mehrer Tabellen was eintragen willst
und beim Übertragen der Daten die Vindung unterbrochen wird
hast du Müll in der Datenbank
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Transaction?

  Alt 6. Jul 2005, 16:53
Weiß jetzt nicht genau, was Du meinst. 8) Aber Transactions sind doch genau für solche Fälle gedacht, um eben zu verhindern, daß Teilergebnissse (wie Du sagst : Müll) abgespeichert werden.

Es geht dabei um das Prinzip : Alles oder Nichts ! Aber wie soll ich nun auf einen Stromausfall reagieren, und noch dazu automatisch ?

Selbst mit einem Timer würden automatische Commits nicht viel nützen, weil garantiert der Strom mitten in dem Zeitintervall ausfällt. So ist das nach Murphy eben immer !

Deshalb bei mir der Button. Ist einer zu blöd den zu betätigen, weil er auf einen Stromausfall wartet, tja dann hat er eventuell Pech. Allerdings sollte die Datenbank auch merken, daß eine Transaktion nicht commited wurde. Kann mir kaum vorstellen, daß das bei MS-SQL nicht geht.
Gruß
Hansa
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: Transaction?

  Alt 6. Jul 2005, 17:02
Eine unterbrochene Verbindung *innerhalb* einer Transaktion wird dazu führen, dass diese *nicht* abgelegt wird.

btw: Gibt es einen besonderen Grund warum du sowas mittelalterliches wie den OleDB Provider nimmst?
Für den Sql Server solltest du dir mal den namespace SqlClient ansehen.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Transaction?

  Alt 6. Jul 2005, 17:22
Robert_G versteht das da wohl genauso wenig wie ich. Was ich meine ist, die Transaction lieber vom Programm steuern zu lassen, als genau um 17:00 zu committen. Hat der jetzt seine ganzen 20 Seiten Inventur eingegeben und ist zu dämlich auch mal zu speichern, dann bin ich zumindest sicher, daß von der Inventur absolut gar nichts in der DB ist ! Hat er 19 Seiten eingegeben, dann muß er trotzdem wieder komplett neu anfangen. 8) Bin leider 100 km weg und kann es nicht testen. Aber glaube bei einem Crash-Test mit Firebird kam die Meldung "es ist noch eine offene Transaktion da, was soll damit gemacht werden (Commit oder Rollback ?" (sinngemäß)
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#7

Re: Transaction?

  Alt 6. Jul 2005, 18:30
Hi
mein Fehler
Stromausfall ist mist

Beispiel

Aus einer Tabelle soll eine Bezahlung erfolgen
In einer anderen soll die Zahlung eingehen.

Ich starte jetzt mein Update in meinem Programm und nun wird die Verbindung unterbrochen.

...
kurzform
wert1 aus Table11 Feld1 auf 0

<------ Verbindung unterbrochen

wert1 in Tabel2 Feld1 eintragen
...

Aus der Tabelle ist zwar die Zahlung ausgegangen aber nicht mehr in die andere Tabelle die Zahlung eingegangen.

Wenn ich das mit den Trasaction richtig verstanden habe....
ich wollte es in einer SP packen
Die Datenbank schreibt bei Trasaction begin noch nicht endgültig in die Datenbank erst wenn alle befehle abgearbeitet sind kommt das Commit sonst das Rollback
und ich weiß jetzt nicht wie ich es in meine SP eintragen soll oder überprüfen kann
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#8

Re: Transaction?

  Alt 6. Jul 2005, 20:11
Hallo,

vielleicht hilft dir dieser Beitrag weiter.

Hier ging zwar um Transactionen und Interbase aber das sollte auch auf MySQL anwendbar sein. Vielleicht hilft es Dir ja weiter.

Warum willst Du das unbedingt über die StoredProc regeln, die DB selber nimmt Dir doch diese Arbeit ab? Darher würde ich schon das ganze über das Programm regeln.
Gruß

Albi
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#9

Re: Transaction?

  Alt 6. Jul 2005, 20:22
Hi
es geht um MSSQL

leider nicht sehr geholfen
da das Trasaction immer vom Programm aus gestartet wird
ich will es aber über eine SP starten

ich weiß jetzt nicht ob das so richtig ist
da ich es nicht testen kann
Delphi-Quellcode:
CREATE PROCEDURE GFC_M_INSERT
   @GFC_M_ID int output,
   @GFC_M_NAME nvarchar(100),
   @GFC_M_AKTIV bit,
   @GFC_M_OUT bit,
   @GFC_M_USER_NAME nvarchar(50),
   @GFC_M_USER_TXT ntext,
   @GFC_M_USER_DATE smalldatetime
AS
SET NOCOUNT ON

BEGIN TRANSACTION

   INSERT INTO [GFC_Medien]
   (
      [GFC_M_NAME],
      [GFC_M_AKTIV],
      [GFC_M_OUT],
      [GFC_M_USER_NAME],
      [GFC_M_USER_TXT],
      [GFC_M_USER_DATE]
   )   
   VALUES
   (
      @GFC_M_NAME,
      @GFC_M_AKTIV,
      @GFC_M_OUT,
      @GFC_M_USER_NAME,
      @GFC_M_USER_TXT,
      @GFC_M_USER_DATE
   )

   SET @GFC_M_ID = @@IDENTITY

IF (@@ERROR = 0)
    COMMIT TRANSACTION
ELSE
       ROLLBACK TRANSACTION

GO
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#10

Re: Transaction?

  Alt 6. Jul 2005, 20:28
Zitat von Albi:
Warum willst Du das unbedingt über die StoredProc regeln, die DB selber nimmt Dir doch diese Arbeit ab? Darher würde ich schon das ganze über das Programm regeln.
????
wenn mir es die DB schon übernimmt warum soll ich es dann noch mal im Programm machen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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 aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf