<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                Spring事務抽象的關鍵是事務策略的概念。事務策略定義在`org.springframework.transaction.PlatformTransactionManager`接口里: ~~~java public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; } ~~~ 這主要是服務提供者接口(SPI),盡管它可以從您的應用程序代碼中以編程方式使用。 因為`PlatformTransactionManager`是一個接口,所以可以根據需要輕松地模擬或存根。 它與諸如JNDI之類的查找策略無關。 `PlatformTransactionManager`實現的定義與Spring Framework IoC容器中的任何其他對象(或bean)相同。 僅此優勢,即使您使用JTA,Spring Framework事務也是值得抽象的。 與直接使用JTA相比,可以更輕松地測試事務代碼。 與Spring的理念保持一致,任何PlatformTransactionManager接口的方法拋出的TransactionException都是未經檢查的(也就是說,它擴展了java.lang.RuntimeException類)。 交易基礎設施故障幾乎總是致命的。 在極少數情況下,應用程序代碼實際上可以從事務失敗中恢復,應用程序開發人員仍然可以選擇捕獲并處理TransactionException。 重點是開發人員不會被迫這樣做。 `getTransaction(..)`方法返回`TransactionStatus`對象,依賴于`TransactionDefinition`參數。 返回的`TransactionStatus`可能表示新事務,或者如果當前調用堆棧中存在匹配的事務,則可以表示現有事務。 后一種情況的含義是,與Java EE事務上下文一樣,`TransactionStatus`與執行線程相關聯。 ` TransactionDefinition` 接口的特點: * 傳播: 一般一個事務內的代碼都運行在同一個事務內,當然也可以暫停當前事務,新建事務,參考[事務傳播](https://docs.spring.io/spring/docs/5.0.7.RELEASE/spring-framework-reference/data-access.html#tx-propagation) * 隔離:此事務與其他事務的工作隔離的程度。 例如,此事務是否可以看到來自其他事務的未提交的寫入? * 超時:此事務在多久之后由底層事務自動回滾。 * 只讀狀態:當您的代碼讀取但不修改數據時,可以使用只讀事務。 在某些情況下,只讀事務可能是一種有用的優化,例如在使用Hibernate時。 這些設置反映了標準的事務概念。 如有必要,請參閱討論事務隔離級別和其他核心事務概念的資源。 理解這些概念對于使用Spring Framework或任何事務管理解決方案至關重要。 `TransactionStatus`接口為事務代碼提供了一種控制事務執行和查詢事務狀態的簡單方法。 應該熟悉這些概念,因為它們對于所有事務API都是通用的: ~~~java public interface TransactionStatus extends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); void flush(); boolean isCompleted(); } ~~~ 無論在spring中使用聲明式或編程式的事務管理,正確定義`PlatformTransactionManager `的實現都是非常重要的.一般是通過依賴注入定義實現. `PlatformTransactionManager `的實現一般需要了解工作的環境:JDBC, JTA, Hibernate等等. 定義jdbc數據源 ~~~xml <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> ~~~ 定義`PlatformTransactionManager `引用`DataSource ` ~~~xml <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> ~~~ 如果你使用JTA在java企業級容器中,那么需要使用`JtaTransactionManager`通過JNDI獲取`DataSource`: ~~~xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/jpetstore"/> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> <!-- other <bean/> definitions here --> </beans> ~~~ `JtaTransactionManager `不需要知道具體`DataSource`,它使用容器的全局事務管理. 也可以簡單的使用Hibernate 的局部事務管理,需要定義Hibernate 的`LocalSessionFactoryBean`,用于獲取Hibernate 會話實例 `DataSource `的配置同jdbc,這里就不再贅述.`HibernateTransactionManager `需要引用`SessionFactory` ~~~xml <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mappingResources"> <list> <value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=${hibernate.dialect} </value> </property> </bean> <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> ~~~ 如果使用Hibernate 并且也使用了全局事務JTA,如下配置 ~~~xml <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"/> ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看