1.事務的概念
事務是一組操作的執行單元,相對於數據庫操作來講,事務管理的是一組SQL指令,比如增加,修改,刪除等,事務的一致性,要求,這個事務內的操作必須全部執行成功,如果在此過程種出現了差錯,比如有一條SQL語句沒有執行成功,那麼這一組操作都將全部回滾
僅用四個詞解釋事務(ACID)
atomic(原子性):要麼都發生,要麼都不發生。
consistent(一致性):數據應該不被破壞。
Isolate(隔離性):用戶間操作不相混淆
Durable(持久性):永久保存,例如保存到數據庫中等
2.數據庫系統提供了四種事務隔離級別
隔離級別 |
含義 |
DEFAULT |
使用後端數據庫默認的隔離級別(spring中的的選擇項) |
READ_UNCOMMITED |
允許你讀取還未提交的改變了的數據。可能導致髒、幻、不可重複讀 |
READ_COMMITTED |
允許在併發事務已經提交後讀取。可防止髒讀,但幻讀和 不可重複讀仍可發生 |
REPEATABLE_READ |
對相同字段的多次讀取是一致的,除非數據被事務本身改變。可防止髒、不可重複讀,但幻讀仍可能發生。 |
SERIALIZABLE |
完全服從ACID的隔離級別,確保不發生髒、幻、不可重複讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的數據表來完成的。 |
髒讀:一個事務讀取了另一個事務改寫但還未提交的數據,如果這些數據被回滾,則讀到的數據是無效的。
不可重複讀:在同一事務中,多次讀取同一數據返回的結果有所不同。換句話說就是,後續讀取可以讀到另一事務已提交的更新數據。相反,“可重複讀”在同一事務中多次讀取數據時,能夠保證所讀數據一樣,也就是,後續讀取不能讀到另一事務已提交的更新數據。
幻讀:一個事務讀取了幾行記錄後,另一個事務插入一些記錄,幻讀就發生了。再後來的查詢中,第一個事務就會發現有些原來沒有的記錄。
3.採用註解的方式配置事務
<bean id=" txManager "
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!– 採用@Transactional註解方式使用事務 -->
<tx:annotation-driven transaction-manager="txManager"/>
@Service
@Transactional
public class PersonService implements PersonService {
}
具體操作詳見