Spring結合jdbc以及mybatis事務控制
阿新 • • 發佈:2018-12-30
事務屬性包含的五個方面分別是什麼
1、事務傳播行為
規定了如果有新的事務應該被啟動還是被掛起,或者方法是否需要在事務中執行。
TransactionDefinition.PROPAGATION_REQUIRED如果當前存在事務,則加入該事務,如果當前沒有事務,則建立一個新的事務。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一個新的事務,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則建立一個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。
掛起:掛起程序在作業系統中可以定義為暫時被淘汰出記憶體的程序,機器的資源是有限的,在資源不足的情況下,作業系統對在記憶體中的程式進行合理性安排,其中有的程序被暫時調離出記憶體,當條件允許時,會被作業系統再次調回記憶體,重新進入等待被執行 的狀態即就緒狀態,系統在超過一定的時間沒有任何動作。
2、事務隔離級別
定義了一個事務可能受其他併發事務影響的程度。
隔離級別是指若干個併發的事務之間的隔離程度。TeanscationDefinition介面中定義了五個表示隔離級別的常量。
TranssactionDefinition.ISOLATION_DEFAULT這是預設值,表示使用底層資料庫的預設隔離級別。
1、read_Uncommitted 最低級別隔離 改不改,改成什麼都能讀。不提交也可以都
2、read_commited 讀提交的資料, 沒提交的不能操作
3、Repeatable 解決不可重複讀/髒讀 效能下降
4、Serializable 不能同時操作一個, 一個操作完 下一個
3、事務的只讀屬性
定義了一個事務中是否是隻讀操作,如果設定只讀那麼資料庫內部就可以對操作進行合適的優化措施,只有傳播行為是Propagtaion_REQUIRED PROPAGATION_REQUIRES_NEW PROPAGATION_NESTED的時候只讀設定才有意義,因為只讀優化是在事務開始的時候由資料庫事實的,而在這三個傳播行為下才有可能啟動一個新事物
4、事務超時
為了使應用程式可以很好的執行,事務不能執行太長的時間,所以這個屬性就控制著時間,只有傳播行為是PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW PROPAGATION_NESTED的時候超時設定才有意義,因為超時時鐘會在開始的時候啟動,而這三個傳播行為下才有可能啟動一個新事務,注意事務超時後會自動回滾
5、事務的回滾規則
定義了哪些異常會導致回滾 而那些不會。預設情況下,事務在遇到執行時異常的時候才會回滾,而遇到檢查時異常時不會回滾。
-Exception表示有Exception丟擲 事務回滾
-表示回滾 +表示提交
髒讀:讀到了無效的資料。
Spring與jdbc結合
jdbc程式設計不變 主要是connection物件的維護,配置並使用資料來源。
1)<!-- 基於jdk的規範資料來源 -->
<bean name="dataSource1"
class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
<property name="networkProtocol">
<value>tcp</value>
</property>
<property name="databaseName">
<value>XE</value>
</property>
<property name="driverType">
<value>thin</value>
</property>
<property name="portNumber">
<value>1521</value>
</property>
<property name="user">
<value>briup</value>
</property>
<property name="serverName" >
<value>127.0.0.1</value>
</property>
<property name="password">
<value>briup</value>
</property>
</bean>
注意:別忘了讀取配置檔案
<!-- 讀取這個資原始檔 讀完之後下面就可以用${key}來去檔案中的value值了 -->
<!-- 這種方式是我們第一節學習的那種配置方式方式的簡寫 -->
<context:property-placeholder location="classpath:oracle.perperties"/>
2)<!-- dbcp資料來源 -->
<bean id="dataSource2"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>${driver}</value>
</property>
<property name="url">
<value>${url}</value>
</property>
<property name="username">
<value>${user}</value>
</property>
<property name="password">
<value>${password}</value>
</property>
<!-- 最大連線數 -->
<property name="maxActive">
<value>80</value>
</property>
<!-- 最大空閒連線數 -->
<property name="maxIdle">
<value>20</value>
</property>
<!-- 最大等待時間:當沒有可用連線時,連線池等待連線被歸還的最大時間 單位:毫秒 -->
<!-- 超過時間則丟擲異常,如果設定為-1表示無限等待 -->
<property name="maxWait">
<value>3000</value>
</property>
</bean>
3)<!-- spring提供的一種資料來源 -->
<bean id="dataSource3"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${driver}</value>
</property>
<property name="url">
<value>${url}</value>
</property>
<property name="username">
<value>${user}</value>
</property>
<property name="password">
<value>${password}</value>
</property>
</bean>
4)c3p0資料來源
<!-- c3p0資料來源 -->
<bean id="dataSource4" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass">
<value>${driver}</value>
</property>
<property name="jdbcUrl">
<value>${url}</value>
</property>
<property name="user">
<value>${user}</value>
</property>
<property name="password">
<value>${password}</value>
</property>
<!--連線池中保留的最小連線數。 -->
<property name="minPoolSize">
<value>5</value>
</property>
<!--連線池中保留的最大連線數。Default: 15 -->
<property name="maxPoolSize">
<value>30</value>
</property>
<!--初始化時獲取的連線數,取值應在minPoolSize與maxPoolSize之間。Default: 3 -->
<property name="initialPoolSize">
<value>10</value>
</property>
<!--最大空閒時間,60秒內未使用則連線被丟棄。若為0則永不丟棄。Default: 0 -->
<property name="maxIdleTime">
<value>60</value>
</property>
<!--當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。Default: 3 -->
<property name="acquireIncrement">
<value>5</value>
</property>
<!--每60秒檢查所有連線池中的空閒連線。Default: 0 -->
<property name="idleConnectionTestPeriod">
<value>60</value>
</property>
<!--定義在從資料庫獲取新連線失敗後重復嘗試的次數。Default: 30 -->
<property name="acquireRetryAttempts">
<value>30</value>
</property>
</bean>
-------------------
spring在jdbc中還提供了模板類 jdbcTemplate
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg index="0" ref="dataSource"></constructorarg>
</bean>-
<bean name="dao" class="com.briup.db.jdbc.JdbcTemplateDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
重點1、jdbcTemplate模板類如何使用:在htmlsingle中搜索即可,其中包含大量使用例項,
重點2、spring結合jdbc時候,不論是否使用這個模板,jdbc事務都是預設提交的。
2、Spring與mybatis結合
注意使用jar包 mybatis-spring-1.2.2.jar
使用spring整合mybatis時,可以使用mybatis-config.xml檔案,也可以不使用。
<!--配置sqlSessionFactory不使用mybatis-config.xml>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.briup.db"></property>
<property name="configurationProperties">
<props>
<prop key="cacheEnabled">true</prop>
</props>
</property>
<!-- 自動掃描mapping.xml檔案 -->
<property name="mapperLocations" value="classpath:com/briup/db/mybatis/AccountMapper.xml" />
</bean>
或者:
<!-- 配置sqlSessionFactory 使用mybatis-config.xml-->
<!-- 直接讀取mybatis-config.xml檔案,裡面和之前配置的一樣 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
最後還需要掃描mybatis中對映介面,以便spring為其生產對應的實現類
<!-- 自動掃描對映介面所在的包 -->
<!-- 將來可以通過介面的名字首字母小寫作為beanName,從spring容器中拿出自動生成的該介面的實現類 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.briup.db" />
</bean>
3、spring事務管理機制
1、程式設計式事務管理(不常用)
所謂程式設計式事務指的是通過編碼方式實現事務
2、宣告式事務管理(常用)
在spring配置檔案中宣告式處理事務來代替程式碼式的處理事務。
在spring中宣告式事務主要是通過 事務屬性 來定義的,事務屬性描述了事務策略如何應用到方法上面。
事務屬性主要包含了以下五個方面/
傳播行為 隔離級別 回滾規則 事務超時 是否只讀
宣告式事務管理的配置方式通常有以下幾種:
注意:配置事務的方式都需要用到事務管理器(切面)和事務攔截器(advice),其實就是aop程式設計,把事務程式碼織入到需要使用的方法上。
spring中實現的aop配置方式很多,在這裡配置事物的時候推薦使用。
1、tx字首的事務標籤和aop字首的標籤結合,將切面 事務管理器 織入到切入點上
2、註解進行事物配置
spring結合jdbc,事務配置在service層指定方法上,使用tx標籤結合aop標籤