Frage

Ich benutze Hibernate -unterstützte JPA als meine Persistenzschicht. Ich habe einen Multi-Thread-Prozess, der Daten aus einem Seifenanruf aggregiert und dann eine Zeile in einer Datenbank speichert. Der Vorgang fügt normalerweise etwa 700 Zeilen ein und dauert ungefähr 1 bis 3 Stunden, wobei die Seifenanrufe der Hauptgutball sind.

Während dieses gesamten Prozesses habe ich die Tabelle, die ich in Sperren einfüge, in Sperren einfüge und keine ausgewählte Aussagen rechtzeitig zurückgibt.

Hier ist der SQL Server -Fehler:

Fehlermeldung: Die Zeitrestaurant -Zeitsperrzeit überschritten überschritten.

Wie kann ich es vermeiden, meine Datenbanktabelle während dieses langwierigen Prozesses zu sperren?

War es hilfreich?

Lösung

Fügen Sie alle 700 Zeilen mit dem ein? gleich Transaktion?

Wo ist Ihre Transaktionsgrenze? Wenn Sie möglicherweise Ihre Transaktionsgrenze senken könnten, dh nur die tatsächliche Einsatzvorrichtung, sodass das Schloss brarelf gehalten wird.

Wenn Sie den gesamten Prozess benötigen, um atomic zu sein, kann es eine Idee sein, ihn in eine Temperaturtabelle zu schreiben und dann einen Bulk -Einsatz (schnell) in die Haupttabelle einzulegen.

Andere Tipps

Sie müssen wahrscheinlich Ihr Isolationsniveau ändern.

Hier sind einige Informationen:http://www.interview-questions-tip-forum.net/index.php/your-questions-on-java/jdbc-transaction/transaction-isolation-levels

Es spricht über die unterschiedlichen Isolationsniveaus und darüber, was sie behilflich sein können. Die allgemeine Möglichkeit, dies zu tun, besteht darin, mit dem Striktisten zu beginnen und dann niedriger zu werden, wenn Sie bessere Antwortzeiten benötigen, während Sie die Anforderungen der Datenintegrität/falschen Lesevorgänge berücksichtigen.

bearbeiten

Spring -Transaktionsniveaus werden verwendet, um JDBC (oder was auch immer) Transaktions -Isolationsniveaus im Transaktionsmanager zu abstrakt. Sie sind in der definiert Transaktiondefinition Klasse und sind statische Mitglieder.

TransactionDefinition.ISOLATION_DEFAULT
Default isolation

TransactionDefinition.ISOLATION_READ_UNCOMMITTED
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions

TransactionDefinition.ISOLATION_READ_COMITTED
Cannot read uncommitted data

TransactionDefinition.ISOLATION_REPEATABLE_READ
Ensures repeatable reads

TransactionDefinition.ISOLATION_SERIALIZABLE
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially.

Es gibt auch Transaktionsausbreitungsniveaus. Möglicherweise verwenden Sie eine Transaktion für reine Lesevorgänge, die möglicherweise übertrieben sein kann. Lesevorgänge erfordern keine Transaktionen. Schreibvorgänge sollten immer eine Transaktion um sie herum haben. Die Ausbreitungsniveaus sind auch in der Transaktiondefinition eindeutig. Diese werden normalerweise in einer Federverkabelungsdatei verwendet, um die Serialisierung und Ausbreitung für einen bestimmten Aufruf zu definieren. Wenn Sie ein Beispiel für Ihre Verkabelung haben, kann ich möglicherweise weitere Hinweise/Informationen geben.

Versuchen Sie, 700 SOAP -Anfragen in einer JPA -Transaktion zu stellen? Tu das nicht. :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top