1泪电、什么是事務(wù)般妙?
事務(wù)是指邏輯上的一組操作,這組操作要么全部成功相速,要么全部失敗碟渺。
2、事務(wù)的特性
①原子性:指事務(wù)的操作要么全部都發(fā)生突诬,要么都不發(fā)生苫拍。
②一致性:指事務(wù)執(zhí)行前后數(shù)據(jù)的完整性必須保持一致。
③隔離性:指多個事務(wù)并發(fā)訪問數(shù)據(jù)庫時(shí)旺隙,一個用戶的事務(wù)不能被其他用戶的事務(wù)所干擾怯疤,多個并發(fā)事務(wù)之間數(shù)據(jù)要相互隔離(可以通過設(shè)置事務(wù)的隔離級別解決,后續(xù)會講到)催束。
④持久性:指一個事務(wù)一旦被提交集峦,它對數(shù)據(jù)庫中的數(shù)據(jù)的改變是永久性的,即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響抠刺。
3塔淤、Spring事務(wù)管理器
Spring事務(wù)管理器高層抽象接口主要有3個接口
①PlatformTransactionManager(平臺事務(wù)管理器):主要是進(jìn)行事務(wù)的提交回滾等功能。
②TransactionDefinition(事務(wù)定義信息):主要包含事務(wù)的隔離級別速妖、傳播行為高蜂、是否超時(shí)等。
③TransactionStatus(事務(wù)具體運(yùn)行狀態(tài)):包括事務(wù)是否已提交罕容、是否是新創(chuàng)建的事務(wù)备恤、是否有保存點(diǎn)等稿饰。
4、PlatformTransactionManager接口
根據(jù)不同的持久化框架提供了不同的PlatformTransactionManager接口實(shí)現(xiàn):
①使用Spring JDBC或iBatis:
org.springframework.jdbc.datasource.DataSourceTransactionManager
②使用Hibernate3.0版本:
org.springframework.orm.hibernate3.0.HibernateTransactionManager
5露泊、TransactionDefinition接口
若不考慮事務(wù)的隔離性喉镰,會引發(fā)安全問題如下:
①臟讀:一個事務(wù)讀取了另一個事務(wù)改寫但還未提交的數(shù)據(jù),如果這些數(shù)據(jù)被回滾惭笑,則讀到的數(shù)據(jù)是無效的侣姆。
②不可重復(fù)讀:在同一事務(wù)中,多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同沉噩。
③幻讀:一個事務(wù)讀取了幾行記錄后捺宗,另一個事務(wù)插入了一些記錄,在后來的查詢中第一個事務(wù)就會發(fā)現(xiàn)有些原來沒有的記錄川蒙。
5.1事務(wù)的隔離級別(四種)
事務(wù)的隔離級別就是用來解決以上三種安全問題的蚜厉,隔離級別從低到高有四種:
①read_uncommited:允許你讀取還未提交的改變了的數(shù)據(jù)⌒笳#可能會導(dǎo)致臟讀弯囊、不可重復(fù)讀、幻讀胶果。
②read_commited:允許在并發(fā)事務(wù)已提交后讀〗锔可防止臟讀早抠,但不可重復(fù)讀、幻讀仍可能發(fā)生撬讽。
③repeatable_read:可防止臟讀蕊连、不可重復(fù)讀,但幻讀仍可能發(fā)生游昼。
④serializable:完全服從ACID的隔離級別甘苍,但是速度是最慢的。
還有就是默認(rèn)的default烘豌,它與你后端使用的數(shù)據(jù)庫默認(rèn)隔離級別一致载庭,比如使用MySQL默認(rèn)就是repeatable_read,使用Oracle默認(rèn)就是read_commited廊佩。
5.2事務(wù)的傳播行為(七種)
事務(wù)的傳播行為主要解決的是業(yè)務(wù)層方法之間相互調(diào)用時(shí)產(chǎn)生的事務(wù)應(yīng)該如何進(jìn)行傳遞的問題囚聚。比如我要調(diào)用service1中的a()和service2中的b()才能完成一個業(yè)務(wù)這種情況。
①propagation_required
②propagation_supports
③propagation_mandatory
④propagation_requires_new
⑤propagation_not_supported
⑥propagation_never
⑦propagation_nested
(詳細(xì)的后續(xù)再進(jìn)行添加)
6标锄、TransactionStatus接口
這里就簡單列舉幾個常用到的方法:
boolean hasSavePoint()//事務(wù)是否有保存點(diǎn)顽铸;
boolean isCompleted()//事務(wù)是否已經(jīng)完成了;
boolean isNewTransaction()//是不是一個新的事務(wù)料皇。