während Transaktion Select-Abfrage in SQL Server 2014 durchführen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von FBB_Swift_Shadow.

    während Transaktion Select-Abfrage in SQL Server 2014 durchführen

    Hallo :).

    Ich befasse mich im Moment mit Datenbankzugriffen, mithilfe von vb.net. Selbstverständlich bin ich dabei auf Transact gestossen.

    Nachdem ich mich inzwischen schon relativ viel mit Transact auseinandergesetzt habe und viel ausprobiert habe, ist mir eine Sache aufgefallen:

    Als ich einen Haltepunkt an die Stelle transaction.Commit() gesetzt hatte (in der Transaktion wird übrigens ein INSERT INTO Befehl ausgelöst) und das Programm bis zu diesem Punkt laufen gelassen hatte konnte ich keinen SELECT Befehl mehr auf meinem Datenbankmanager ausführen.

    Es muss doch sicherlich eine Möglichkeit geben, die es erlaubt auch während einer laufenden Transaction noch an seine Daten zu kommen.
    Stand jemand schon mal vor der gleichen Frage oder hat jemand einen guten Einfall?
    Hallo FBB,
    wie sieht denn deine Abfrage aus?
    Du musst dich bei Transact an eine gewisse (logische) Reihenfolge halten, da diese sonst nicht richtig verarbeitet wird.--

    oder Moment.. Du setzt einen Haltepunkt und willst dann eine zusätzliche Abfrage machen?
    Dies ist nicht möglich, da deine Query (/anfrage) ja gerade beantwortet wird und noch nicht zu Ende ist.

    FBB_Swift_Shadow schrieb:

    während einer laufenden Transaction noch an seine Daten zu kommen

    Eben während einer Transaktion (Insert) sollte keiner mehr darauf zugreifen können, weil der Datensatz ja gesperrt ist, bis die Änderung vorgenommen wurde.

    Mal angenommen du überweist Peter 1.000€ und Peter würde gleichzeitig Hans 1.000€ überweisen, dann würde Peter ja auf "0" rauskommen.
    Wenn nun allerdings während Peters Überweisung Du Peter das Geld "zwischendrin" gibst, hätte er ja 2.000€ und die 1.000€ wären trotzdem bei Hans angekommen. (Oder vielleicht auch gar nicht? - Hoffe das Beispiel ist in Ordnung. ^^ )

    Das einzige was du machen könntest wäre evtl. eine View erstellen, um zu sehen was geschieht-- aber da bin ich mir nicht ganz sicher.
    Also solange die Query nicht beendet wird (.Close()) sperrt sie sozusagen andere Vorgänge, also der Server macht das ja.. Eins nach dem anderen.
    Option Strict On!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Drahuverar“ ()

    Du kannst so auf eine Tabelle zugreifen die gelockt ist: (IN MS SQL SERVER)

    SQL-Abfrage

    1. select * from tabelle with (nolock)


    Dies garantiert aber keine "richtigen" Daten. Im Normalfall werden durch Transaktionen auch nur Keys oder Pages gelockt. Das heißt wenn du spezielle Primärschlüssel abfragst die von der Transaktion nicht betroffen sind, sollten diese Daten abfragbar sein.
    Das ist meine Signatur und sie wird wunderbar sein!
    Vielleicht erwähnenswert: Transaktion heißt nicht notwendigerweise, dass eine Tabelle gesperrt wird. Gibt verschiedene Stufen mit der man z.B. auch regeln kann, dass Daten sehr wohl zwischendurch gelesen werden können (ohne DBMS-Spezifika, aber unter Umständen mit Nebeneffekten).
    Stichwort: IsolationLevel
    danke erstmal für die wissenswerten Informationen :)

    Ich habe inzwischen rausgefunden, dass es reicht das Isolationslevel vor der Transaktion anzugeben. Das geht im Db-Manager unter "Abfrageoptionen" und in vb.net mithilfe einer Überladung der Funktion BeginTransaction.
    connection
    .BeginTransaction(IsolationLevel.ReadUncommitted) sorgt z.B. dafür, dass gesperrte Datensätze einfach nicht gelesen werden und connection.BeginTransaction(IsolationLevel.snapshot) sorgt dafür, dass der aktuelle Stand (also mit den Veränderungen aus der noch nicht ausgeführten Transaktion) angezeigt werden.