1. 程式人生 > 實用技巧 >spring快速複習2事務及一些使用到的設計模式

spring快速複習2事務及一些使用到的設計模式

事務管理器
Mybatis(JdbcTeamplate))的事務管理器: DataSourceTransactionManager
Hibernate事務管理器:HibernateTransactionManager
事務的基本特性(ACID)
原子性:一個事務要麼都提交要麼都不提交

一致性:AB轉賬事務提交後總金額不發生改變

隔離性:事務隔離級別
	read uncommitted 讀未提交
	存在:髒讀 不可重複讀 幻讀
		讀取了另一個事務未提交的資料
	read committed讀已提交
	存在:不可重複讀 幻讀
	解決了髒讀 讀已提交,一個事務讀到另一個事務已經提交的資料。
	repeatable read:可重複讀
	存在: 幻讀,針對  insert操作
	一個事務中讀到的資料始終保持一致,無論另一個事務是否提交
	serializable:序列化
	只能執行一個事務
永續性:一個事務一旦提交,它對資料庫中資料的改變應該是永久性的

事務的傳播 方法A 呼叫方法B AB中的事務的傳播
@Transactional(propagation(傳播) = Propagation.REQUIRED)
REQUIRED:沒有事務建立 有加入事務
SUPPORTS:有事務就用沒有就不用
一般情況下,生產環境中都是使用預設的Required
只讀事務:優化手段
@Transactional(readOnly = true)用於查詢
重點 宣告事務
事務管理器 資料來源 切面(切點+增強)
xml配置事務:
//事務管理器

//資料來源

	//配置增強處理
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!--
			<tx:method > 標籤作用:批量設定切入點方法的事務屬性
			name屬性:指定業務層的方法名稱,可以使用*萬用字元
			propagation屬性:事務的傳播行為,預設REQUIRED,可以省略
			isolation屬性:事務的隔離級別,預設使用資料庫的隔離級別,可以省略
			read-only屬性:是否只讀事務,預設為false,可以不填
			-->
			<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
			<tx:method name="select*" read-only="true" propagation="SUPPORTS"/>
			<tx:method name="*"></tx:method>
		</tx:attributes>
	</tx:advice>
	
	<!--配置AOP宣告式事務 配置切面 引入切點和增強處理-->
	<aop:config>
		<!--
		配置aop的通知增強
		advice-ref屬性:設定外部標籤的通知增強
		pointcut屬性:配置切入點(切入點表示式)
		-->
		<aop:advisor advice-ref="txAdvice" pointcut="execution( * com.itheima.service.*.*(..))"/>
	</aop:config>

註解配置宣告式事務:
		<!--
			配置事務管理器
		-->
		<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
			<!--配置資料來源-->
			<property name="dataSource" ref="dataSource"/>
		</bean>
		<!--配置註解事務支援-->
		<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
@Transactional註解
	指定類   方法都開啟事務
	指定方法 只有這個方法開啟  (可以和類相互配合 優先選擇類)
	
//查詢propagation傳播方式 readOnly只讀  isolation隔離級別mysql預設REPEATABLE_READ(重複讀)
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true,isolation = Isolation.DEFAULT)
//增刪改
@Transactional(propagation = Propagation.REQUIRED,readOnly = false,isolation = Isolation.REPEATABLE_READ)

JdbcTemplate
spring提供用於連資料庫
設計模式
工廠模式 BeanFactory
單例模式 scope指定
動態代理 aop底層使用jdk動態代理和cglib動態代理
模板方法模式 JdbcTemplate物件,應用了模板方法模式