事務(wù)的四個(gè)特性(caid):
原子性:要么全部成功commit,要么全部失敗rollback.
一致性:rollback后的數(shù)據(jù)和原來(lái)的一致。
隔離性:事務(wù)和事務(wù)之間不干擾。一個(gè)事務(wù)必須與另外一個(gè)事務(wù)的執(zhí)行結(jié)果隔離開(kāi)。
持久性:執(zhí)行成功。持久化數(shù)據(jù)。
事務(wù)和鎖:
數(shù)據(jù)庫(kù)操作都會(huì)產(chǎn)生鎖,分為共享鎖(select語(yǔ)句產(chǎn)生)和排他鎖(dml語(yǔ)句)。一個(gè)事務(wù)中的語(yǔ)句執(zhí)行完成后,在commit之后,語(yǔ)句影響的表記錄才可以解鎖。
如果沒(méi)有定義事務(wù)隔離級(jí)別因此多個(gè)事務(wù)操作同一條數(shù)據(jù)可能會(huì)違反事務(wù)的caid特性。存在下面2個(gè)問(wèn)題:
1)臟讀?。?/p>
一個(gè)事務(wù)讀取另外一個(gè)尚未提交的數(shù)據(jù),然后第二個(gè)事務(wù)回滾了,那么第一個(gè)事務(wù)讀取的就是無(wú)效的數(shù)據(jù)。
2)丟失數(shù)據(jù)修改:兩個(gè)事務(wù)同時(shí)對(duì)一條數(shù)據(jù)修改,一個(gè)先提交,一個(gè)后提交,則先提交的事務(wù)的修改數(shù)據(jù)無(wú)效。
事務(wù)的屬性:
1)事務(wù)的傳播屬性
設(shè)置事務(wù)的屬性,來(lái)決定方法用不用事務(wù),如何用。
2)事務(wù)的隔離級(jí)別
ISOLATION_DEFAULT?
使用數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別
ISOLATION_COMMITTED?
允許讀取其他并發(fā)事務(wù)已經(jīng)提交的更新(防此臟讀)
ISOLATION_READ_UNCOMMITTED?
允許讀取其他并發(fā)事務(wù)還未提交的更新,會(huì)導(dǎo)致事務(wù)之??????????????? 間的3個(gè)缺陷發(fā)生,這是速度最快的一個(gè)隔離級(jí)別,但同??????????????? 時(shí)它的隔離級(jí)別也是最低
ISOLATION_REPEATABLE_READ?
除非事務(wù)自身修改了數(shù)據(jù),否則規(guī)定事務(wù)多次重復(fù)讀取?? ??? ?數(shù)據(jù)必須相同(防此臟讀,不可重復(fù)讀)
ISOLATION_SERIALIZABLE?
這是最高的隔離級(jí)別,它可以防此臟讀,不可重復(fù)讀和?? ??? ?幻讀等問(wèn)題,但因其侵占式的數(shù)據(jù)記錄完全鎖定,導(dǎo)致?
它影響事務(wù)的性能,成為隔離級(jí)別中最展慢的一個(gè)。?
3)事務(wù)只讀
PROPAGATION_REQUIRED,readOnly?
用于提升只讀操作的效率。
4)事務(wù)超時(shí)
????PROPAGATION_REGUIRED,timeout_5,readOnly
超過(guò)5s,沒(méi)有回應(yīng)則,將事務(wù)回滾。
常用連接池: 單線程 apache dbcp?:org.apache.commons.dbcp.BasicDataSource
兼容dbcp且處理高并發(fā)的?? tomcat pool jdbc:?org.apache.tomcat.jdbc.pool.DataSourc
聲明式事務(wù):
spring 用aop在方法執(zhí)行前開(kāi)啟一個(gè)事務(wù),順利執(zhí)行完commit,異常則rollback。所以不用在方法里面來(lái)開(kāi)啟和關(guān)閉事務(wù)。