1. 程式人生 > >Spring結合jdbc以及mybatis事務控制

Spring結合jdbc以及mybatis事務控制

事務屬性包含的五個方面分別是什麼
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標籤