Vorwort
Die Download -Adresse des Beispielcode für diesen Artikel (vollständig ausgeführt, einschließlich SQL -Dateien, ändern Sie die Datenbankkonfiguration nach dem Herunterladen): Klicken Sie hier, um herunterzuladen
Mehrere Datenbankvorgänge werden als Ganzes gesteuert und gelingt oder scheitern zusammen.
Atomizität: Bezieht sich auf eine Transaktion, die eine untrennbare Arbeitseinheit ist, und Operationen in einer Transaktion treten entweder oder keine auf.
Konsistenz: bedeutet, dass die Integrität von Daten vor und nach einer Transaktion konsistent sein muss.
Isolierung: Wenn mehrere Benutzer gleichzeitig auf die Datenbank zugreifen, können die Transaktionen eines Benutzers nicht durch die Transaktionen anderer Benutzer gestört werden, und die Daten zwischen mehreren gleichzeitigen Transaktionen müssen voneinander isoliert werden.
Persistenz: Sobald eine Transaktion festgelegt ist, sind ihre Änderungen an den Daten in der Datenbank dauerhaft, und das Ausfall der Instant -Datenbank sollte keine Auswirkungen darauf haben.
-Plattform TransactionManager Transaction Manager (Commit, Rollback-Transaktionen)
Spring bietet verschiedene Plattform -Transaktionsmanager -Schnittstellenimplementierungen für verschiedene Persistenz -Frameworks. wie:
Verwenden von DataSourcetransactionManager bei der Durchführung von Daten mit Spring JDBC oder Ibatis
Verwenden Sie HibernatetransactionManager, wenn Sie Hibernate3.0 für anhaltende Daten verwenden
-Transaktionsdefinitionsinformationsinformationen (Isolation, Ausbreitung, Zeitüberschreitung, schreibgeschützte)
Dirty Lesen: Eine Transaktion liest Daten, die von einer anderen Transaktion umgeschrieben wurden, aber noch nicht eingereicht wurden. Wenn diese Daten zurückgerollt sind, sind die Lesedaten ungültig.
Keine sich wiederholende Lektüre: In derselben Transaktion sind die Ergebnisse, die durch das mehrmalige Lesen derselben Daten zurückgegeben werden, unterschiedlich.
Fantasy Reading: Nach einer Transaktion wird mehrere Datensätze gelesen, eine andere Transaktion fügt einige Datensätze ein, und das Fantasy -Lesen tritt auf. In der späteren Abfrage wird die erste Transaktion einige Datensätze finden, die ursprünglich nicht verfügbar waren.
Transaktions -Isolationsstufe: (fünf Typen)
Unter ihnen verwendet MySQL standardmäßig die Isolationsstufe für die Isolationsstufe von Repeatableableableable. Oracle verwendet standardmäßig die Isolationsstufe read_commidt
Transaktionskommunikationsverhalten: (sieben Typen)
-transactionStatus Transaktionspezifischer Betriebsstatus
A. Programmiertransaktionsmanagement (basierend auf der Java-Programmiersteuerung, selten verwendet)-siehe Demo1-Paket
Verwenden Sie TransactionTemplate, um mehrere DAO -Operationen zu verkapulieren
*B. Deklarative Transaktionsmanagement (federbasierte AOP-Konfigurationskontrolle)
- Basierend auf TransactionProxyFactoryBean. (Selten verwendet)-Siehe Demo2-Paket
Es ist notwendig, eine Transaktionsproxyfaktorik für jede Klasse zu konfigurieren, die sich zur Verbesserung der Transaktionsmanagements unterzieht.
-Basierend auf der XML-Konfiguration (häufig verwendet)-Siehe Demo3-Paket
Nach der Konfiguration muss der Klasse nichts hinzugefügt werden.
Wenn Aktion ein Zielobjekt ist, um die Transaktion einzugeben, müssen Sie das Attribut "Proxy-Target-Class =" True "zum Element <AOP: config> hinzufügen. Der Grund ist, das Spring -Framework zu informieren, um die CGGLIB -Technologie zu verwenden, um Aktionsklassen mit Transaktionsmanagementfunktionen zu generieren.
-Basierend auf Anmerkungen (einfache Konfiguration, häufig verwendet)-Siehe Demo4-Paket
Aktivieren Sie die Transaktionsannotationskonfiguration in applicationContext.xml. (Definieren Sie in applicationContext.xml einfach die Bean und enden Sie die folgenden Elemente an)
<bean id = "txManager"> <Eigenschaft name = "sessionfactory"> </property> <tx: Annotationsgetriebene Transaktionsmanager = "TxManager"/>
Verwenden Sie @transactional in der Zielkomponentenklasse, die vor der Klasse oder vor der Methode definiert werden kann.
--Programmierung
/ *** @Description: DAO -Schichtschnittstelle des Übertragungsfalles**/ public interface contodao {/ *** @param out*: übertragenes Konto übertragen* @param enden / ** * * @param in *: Konto übertragen * @param enden *: Betrag überweisen */ public void Inmoney (String in, Double Money); } / *** @Description: Die DAO-Schicht-Implementierungsklasse des Übertragungsfalls*/ public class AccountDaOImpl erweitert JDBCDAOSUPPORT implementiert AccountDao {/ *** @param out this.getJdbctemplate (). Update (SQL, Geld, out); } / *** @param in*: Konto übertragen* @param enden*: Überweisen Sie den Betrag* / @Override public void Inmoney (String in, Double Money) {String SQL = "Aktualisieren Sie das Konto set enden Geld = Geld+? Wo name =?"; this.getJdbctemplate (). Update (SQL, Geld, in); }} / *** @Description: Geschäftsschnittstelle des Übertragungsfalles**/ public interface Accountservice {/ *** @param out: übertragen* @param in: Übertragung Konto* @param ond. } / *** @Description: Business Layer -Implementierungsklasse des Übertragungsfalls*/ public class AccountserviceImpl implementiert Accountservice {// Dao private contodao contodao; // Vorlage zum Injizieren von Transaktionsmanagement private TransactionTemplate TransactionTemplate; / ** * @param out *: übertragen * @param in *: Konto übertragen * @param enden *: Überweisen Sie den Betrag */ @Override public void Transfer (endgültige Zeichenfolge, endgültiger Zeichenfolge, endgültiges Doppelgeld) {// Wenn eine Ausnahme während des Vorgangs auftritt, kann der vorherige Betrieb abgeschlossen sein. Wenn der letztere nicht kann, ist die Übertragung erfolgreich, die Übertragung wird jedoch nicht empfangen. // AccountDao.outmoney (out, Geld); // int i = 1/0; // AccountDao.inmoney (in, Geld); transactionTemplate.execute (neue transactioncallbackwithoutresult () {@Override protected void doIntransactionWithoutresult (TransactionStatus transactionStatus) {accountDao.outmoney (Out, Money); // Int i = 1/0; // Transaktionskontrolle. Geld); } }); } public void setAccountDao (AccountDao AccountDao) {this.accountdao = accountDao; } public void setTransactionTemplate (TransactionTemplate TransactionTemplate) {this.transactionTemplate = transactionTemplate; }}applicationContext1.xml
<!-Externe Eigenschaftendateien einführen-> <Kontext: Property-Placeholder location = "classPath: jdbc.properties" /> <!-Konfigurieren Sie C3P0-Verbindungspool-> <bean id = "dataSource"> <Eigenschaft name = "triverClass" value = "$ {jdbc.driverClass}" /> <Stiefname = "Jdbcurl". value = "$ {jdbc.url}" /> <Eigenschaft name = "user" value = "$ {jdbc.username}" /> <Eigenschaft name = "password" value = "$ {jdbc.password}" /> < /bean> <!-Konfigurieren Sie die Business-Layer-Klasse-> <bean id = "AccountService" AccountService "AccountService" AccountService "AccountService". <!-Die Vorlage für die Transaktionsmanagement-> <Eigenschaft name = "transactionTemplate" ref = "transactionTemplate" /> < /bean> <!-Konfigurieren Sie die DAO-Klasse (vereinfacht, JdbCtemplate wird automatisch konfiguriert)-> <bean id = "accountdao"> < /conformation name = dataSource "dataSource" ref = "dataSource". vereinfacht)-> <!-<bean id = "jdbCtemplate"> <Eigenschaft name = "dataSource" ref = "dataSource" /> < /bean> <bean id = "contodao"> <Eigenschaft name = "jdbctemplate" ref = " =================================================================ieben ============================================================ieben ============================================================ieben ============================================================ieben Vorlage für Transaktionsverwaltung konfigurieren: Klassen, die von Spring zur Vereinfachung der Transaktionsverwaltungscode bereitgestellt wurden -> <bean id = "transactionTemplate"> <Eigenschaft name = "transactionManager" ref = "transactionManager"/> </bean>prüfen:
@Runwith (SpringJunit4ClassRunner.class) @ContextConfiguration ("classPath: applicationContext1.xml") public class TransactionTest {@Resource (name = "AccountService") private AccountService -Kontoservice; @Test public void Demo1 () {AccountService.transfer ("AAA", "BBB", 200D); }}-Eine Methode basierend auf TransactionProxyFactoryBean
public class AccountServiceImpl implementiert Accountservice {// Dao private contodao contodao; / ** * @param out *: übertragen * @param in *: Konto übertragen * @param enden *: Betrag überweisen */ @Override public void Transfer (String Out, String in, Double Money) {contodao.outmoney (Out, Geld); // int i = 1/0; AccountDao.inmoney (in, Geld); } public void setAccountDao (AccountDao AccountDao) {this.accountdao = accountDao; }}applicationContext2.xml
<!-Externe Eigenschaftendateien einführen-> <Kontext: Property-Placeholder location = "classPath: jdbc.properties" /> <!-Konfigurieren Sie C3P0-Verbindungspool-> <bean id = "dataSource"> <Eigenschaft name = "triverClass" value = "$ {jdbc.driverClass}" /> <Stiefname = "Jdbcurl". value = "$ {jdbc.url}" /> <Eigenschaft name = "user" value = "$ {jdbc.username}" /> <Eigenschaft name = "password" value = "$ {jdbc.password}" /> < /bean> <!-Konfigurieren Sie die Business-Layer-Klasse-> <bean id = "AccountService" AccountService "AccountService" AccountService "AccountService". </bean> <!-Konfigurieren Sie die DAO-Klasse (vereinfacht, konfigurieren Sie automatisch jdbctemplate)-> <bean id = "contoDao"> <Eigenschaft name = "dataSource" ref = "dataSource"/> </bean> <!-- ==============================================================================================ieben ===========================================================================================================ieben ==============================================================================================ieben ===========================================================================================================ieben -> <!-transaktionsmanager konfigurieren-> <bean id = "transactionManager"> <Eigenschaft name = "dataSource" ref = "dataSource" /> < /bean> <!-Konfigurieren Sie den Proxy für die Geschäftsschicht-> <bean id = "AccountServiceProxy"> <! name = "transactionManager" ref = "transactionManager"> </Eigenschaft> <!-Inject Transaction-Eigenschaften-> <Eigenschaft name = "transactionAttributes"> <props> <!-Format von Prop:* Ausbreitung: Transaktionsverhalten* Isotation: Transaktions-Isolationsstufe* Readon: SECE-EXPRAUTIONS-Rollen-Roll-Roll-Roll-Roll-Roll-Rollen-Roll-Rollen-Roll-Rollen-Rollen-Rollen-Rollen. Transaktionen-> <Prop Key = "Transfer"> Propagation_Required </prop> <!-<Prop Key = "Transfer"> Propagation_Required, Readonly </prop>-> <!-<prop Key = "Transfer"> Propagation_Required, Readonly </prop>-> <! -> </props> </property> </bean>prüfen:
@Runwith (SpringJunit4ClASSRunner.class) @ContextConfiguration ("classPath: applicationContext2.xml") public class TransactionTest { / *** Stellen Sie sicher, dass Sie die Proxy -Klasse injizieren: Weil die Proxy -Klasse verbesserte Operationen* //resource (name = "ush. Accountservice Accountservice; @Test public void Demo1 () {AccountService.transfer ("AAA", "BBB", 200D); }}-basiert auf der XML-Konfiguration
public class AccountServiceImpl implementiert Accountservice {// Dao private contodao contodao; / ** * @param out *: übertragen * @param in *: Konto übertragen * @param enden *: Betrag überweisen */ @Override public void Transfer (String Out, String in, Double Money) {contodao.outmoney (Out, Geld); // int i = 1/0; AccountDao.inmoney (in, Geld); } public void setAccountDao (AccountDao AccountDao) {this.accountdao = accountDao; }}applicationContext3.xml
<!-Externe Eigenschaftendateien einführen-> <Kontext: Property-Placeholder location = "classPath: jdbc.properties" /> <!-Konfigurieren Sie C3P0-Verbindungspool-> <bean id = "dataSource"> <Eigenschaft name = "triverClass" value = "$ {jdbc.driverClass}" /> <Stiefname = "Jdbcurl". value = "$ {jdbc.url}" /> <Eigenschaft name = "user" value = "$ {jdbc.username}" /> <Eigenschaft name = "password" value = "$ {jdbc.password}" /> < /bean> <!-Konfigurieren Sie die Business-Layer-Klasse-> <bean id = "AccountService" AccountService "AccountService" AccountService "AccountService". </bean> <!-Konfigurieren Sie die DAO-Klasse (vereinfacht, konfigurieren Sie automatisch jdbctemplate)-> <bean id = "contoDao"> <Eigenschaft name = "dataSource" ref = "dataSource"/> </bean> <!-- =================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== : Transaktionsausbreitungsverhalten Isolierung: Transaktionisolationsstufe nur schreibgeschützt: Nur schreibgeschützte Rollback-für: Welche Ausnahmen sind aufgetreten. <AOP: Pointcut Expression = "Execution (* com.zs.spring.demo3.AcountService+.* (..))" id = "pointcut1"/> <!-Konfiguration Abschnitt-> <AOP: Advisor Ratschläge-REF = "TxAdvice" pointcut-ref = "pointcut1"/> </aOP:prüfen:
/ *** @Description: Deklarative Transaktionsverwaltungsmethode von Spring XML*/ @runwith (SpringJunit4ClASSRunner.ClASS) @ContextConfiguration ("ClassPath: ApplicationContext3.xml") öffentlich-Klassen-Transaktions-TEST {/ ** *** MUSSOW-MUSSOW-MUSSOW-MUSSOW-AUSPRAGE Die Proxy-Klasse. "Accountservice") privater Kontenservice -Accountservice; @Test public void Demo1 () {AccountService.transfer ("AAA", "BBB", 200D); }}-basiert auf Annotation
/** * @Transactional Propagation: Transaction propagation behavior isolation: Transaction isolation level readOnly: Read-only* rollbackFor: Which exceptions have occurred noRollbackFor: Which exceptions have occurred not rollback* rollbackForClassName Rollback according to the exception class name*/ @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false) public class AccountServiceImpl implementiert Accountservice {// Dao injizieren Übertragung private contodao contodao; / *** @param out*: Konto übertragen* @param in*: Konto überweisen* @param enden*: Überweisen Sie den Betrag*/ @Override public void Transfer (String Out, String in, Double Money) {contodao.outmoney (Out, Geld); // int i = 1/0; AccountDao.inmoney (in, Geld); } public void setAccountDao (AccountDao AccountDao) {this.accountdao = accountDao; }}applicationContext4.xml
<!-Externe Eigenschaftendateien einführen-> <Kontext: Property-Placeholder location = "classPath: jdbc.properties" /> <!-Konfigurieren Sie C3P0-Verbindungspool-> <bean id = "dataSource"> <Eigenschaft name = "triverClass" value = "$ {jdbc.driverClass}" /> <Stiefname = "Jdbcurl". value = "$ {jdbc.url}" /> <Eigenschaft name = "user" value = "$ {jdbc.username}" /> <Eigenschaft name = "password" value = "$ {jdbc.password}" /> < /bean> <!-Konfigurieren Sie die Business-Layer-Klasse-> <bean id = "AccountService" AccountService "AccountService" AccountService "AccountService". </bean> <!-Konfigurieren Sie die DAO-Klasse (vereinfacht, konfigurieren Sie automatisch jdbctemplate)-> <bean id = "contoDao"> <Eigenschaft name = "dataSource" ref = "dataSource"/> </bean> <!-- ==============================================================================================ieben ===========================================================================================================ieben ==============================================================================================ieben ===========================================================================================================ieben Configure Transaction Manager-> <bean id = "transactionManager"> <Eigenschaft name = "dataSource" ref = "dataSource"/> </bean> <!-Schalten Sie Annotation Transaction-> <TX: Annotationsgetriebene Transaktionsmanager = "TransactionManager"/> einprüfen:
@Runwith (SpringJunit4ClASSrunner.class) @ContextConfiguration ("classPath: applicationContext4.xml") public class TransactionTest { / *** Stellen Sie sicher, dass Sie die Proxy -Klasse injizieren: Weil die Proxy -Klasse die private Account -Account -Account -Account -Account -Account -Account -Account -Account -Account -Account -Account (name = "Account"). @Test public void Demo1 () {AccountService.transfer ("AAA", "BBB", 200D); }}Für einen bestimmten Code- und Datenbankdatei -Referenzprojekt Kompletter Code:
http://xiazai.vevb.com/201805/yuanma/spring-transaction_jb51.rar
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.