事務指的是邏輯上的一組操作,這組操作要麼全部成功,要麼全部失敗
特性:
原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生
一致性:指事務前後數據的完整性必須保持一致
隔離性:指多個用戶並發訪問數據庫時,一個用戶的事務不能被其他用戶的事務所干擾,多個並發事務之間數據要相互隔離
持久性:指一個事務一旦被提交,它對數據庫中數據的改變是永久性的
Spring事務管理高層抽象主要包括3個接口
PlatformTramsactionManager(事務管理器)、TransactionDefinition(事務定義信息(隔離、傳播、超時、只讀))、TransactionStatus(事務具體運行狀態)
Spring為不同的持久化框架提供了不同PlatformTramsactionManager接口的實現
使用Spring JDBC或iBatis進行持久化數據時使用:org.springframework.jdbc.datasource.DataSourceTransactionManager
使用Hibernate3.0版本進行持久化數據時使用:org.springframework.orm.hibernate3.HibernateTransactionManager
事務隔離級別(ISOLATION)
DEFAULT:使用後端數據庫默認的隔離級別
READ_UNCOMMITED:允許你讀取還未提交的改變了的數據。可能導致髒、幻、不可重復讀
READ_COMMITTED:允許在並發事務已經提交後讀取,可防止髒讀,但幻讀和不可重復讀仍可發生
REPEATABLE_READ:對相同字段的多次讀取是一致的,除非數據被事務本身改變。可防止髒、不可重復讀,但幻讀仍可能發生。
SERIALIZABLE:完全服從ACID的隔離級別,確保不發生髒、幻、不可重復讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的數據表來完成的
Mysql默認采用REPEATABLE_READ隔離級別
Oracle默認采用READ_COMMITTED隔離級別
事務傳播行為
PROPAGATION_REQUIRED:支持當前事務,如果不存在就新建一個(兩個操作在一個事務裡)
PROPAGATION_REQUIRES_NEW:如果有事務存在,掛起當前事務,創建一個新的事務(兩個操作不在一個事務裡)
PROPAGATION_NESTED:如果當前事務存在,則嵌套事務執行(事務保存點)
Spring支持兩種方式事務管理
編程式的事務管理:通過TransactionTemplate手動管理事務,實際應用中很少用
使用XML配置聲明式事務:Spring的聲明式事務是通過AOP實現的,開發中推薦使用
*基於TransactionProxyFactoryBean的方式(很少使用)
*基於AspectJ的XML方式(經常使用)
*一旦配置好之後,類上不需要添加任何東西
*基於注解方式(經常使用)
*配置簡單。需要在業務層類上添加一個@Transactional的注解