?? 緩存及事務.txt
字號:
事務的四大屬性:
1、原子性:要么全成功,要么全失敗
2、持久性:持久化到數據庫中
3、一致性:一個業務相關的處理全部執行到。
4、隔離性:事務之間不影響
沒有隔離性出現的問題:
1、臟讀:事務1修改休眠,事務2將事務1修改后的值取出處理后提交到數據庫中。
事務1
update buy set amount=amount+100 where buyID=1;
sleep(1000);
rollback;
事務2
update buy set amount=amount+100 where buyID=1;
commit;
2、覆蓋更新:事務1與事務2從數據庫中同時讀取數據,事務1修改但沒有提交時休眠了
事務2提交后,事務1提交數據,事務1將事務2的數據覆蓋了。
事務1
update buy set amount=amount+100 where buyID=1;
sleep(1000);
commit;
事務2
update buy set amount=amount+100 where buyID=1;
commit;
3、不可重復讀:同一個事務相同的select語句結果不一樣,主要針對update。
事務1:
select * from buy;
sleep(1000);
select * from buy;
事務2
update buy set amount=amount+100 where buyID=1;
commit;
4、幻想讀:同一個事務相同的select語句第一次執行時有,第二次執行時沒有,反之亦然。
事務1:
select * from buy;
sleep(1000);
select * from buy;
事務2
delete from buy where buyID=1;
commit;
或
insert into buy;
commit;
數據庫的隔離性:
1、讀未提交:可以讀取未提交的數據,不要以防止臟讀及覆蓋更新。
2、讀已提交:是數據庫默認的事務處理方式。
讀取的數據是已提交的,可以防止臟讀。
當修改一行并提交時,系統會將當前所在的版本也數據
對應行的版本比較,如果小于數據版本報錯回退,否則提交,可以防止覆蓋更新。
分類:
樂觀鎖:游標打開行后,對打開的所有行不加鎖,另一個事務可以讀,也可以
改,讓系統的并發性提高,但如果游標所在的行被另一個事務修改,當前
游標所在行再去修改并提交時發現游標所在行的當前版本比數據庫的版
本低,報錯,回退。
悲觀鎖:游標打開行后,對打開的所有行加鎖,另一個事務只可以讀,不可以
改,能夠保證當前游標所事務的修改一定成功,但讓系統性能降低。
3、可重復讀:將上一個select的結果保留一個副本,下一個相同的select語句
從副本中取。
4、串行化:一個事務select一個表的數據后,其余的事務只可以讀,不可以增、刪、改。
相當于將整個表鎖定。
事務的實現
1、代碼式:通過代碼實現
con.setAutoCommit(false);
con.commit();
Transaction trans=session.beginTransaction();
trans.commit();
2、聲明式:通過配置文件文明事務的類型。
ejb2/ejb3/spring的事務選擇方式
REQUIRED(默認):有則用已有的,沒有則產生一個新的。
MANDATORY:方法前必須有一個事務,否則報錯。
REQUIRESNEW:不管有前面有沒有事務都產生一個新事務,如果有將前一個事務暫停。
SUPPORTS:如果前面有一個事務用,沒有不用。
NOT_SUPPORTED:不用事務,如果有事務就報錯。
緩存的分類:
1、事務級(一級緩存):session級緩存,級存在事務內有效
2、應用級(二級緩存):sessionFactory級緩存,讓sessionFactory只有一個實例,
所有的session可以共享sessionFactory中的緩存。
3、(集群)分部式(多個二級緩存):一臺主機的信息發生改變要通知其它所有的主機同步數據。
其它可能將當數據刪除,需要時再重新取。
也可能是將更新的數據發送給所有其它主機進行同步。
要慎用,可能沒有使系統的性能提升而降了。
緩存的目的:
1、提高系統運行的效率。
緩存的原則:
1、數據必須在可接受的范圍內。
2、重復查詢高的數據
3、更新小或并發更新小的數據
緩存的實現:用ehcache實現
1、hibernate提供了支持緩存的接口,通過修改
hibernate.cfg.xml設置緩存。
2、將ehcache.jar拷入工程
3、要src的根目錄下加入ehcache.xml說明緩存。
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
3、在hibernate.cfg.xml中加入兩個屬性
a、說明提供二級緩存驅動類
b、說明query也支持緩存
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<property name="hibernate.cache.use_query_cache">true</property>
4、在具體的hbm.xml中說明當前類使用二級緩存
<cache stage="read-only"/>
5、在執行query之前設置其支持二級緩存
query.setCacheable(true);
list與iterator的區別
1、list初始執行時只執行一個sql,利用緩存的前提是有相同的Hql
如果Hql相同,但對應的數據沒有,根據主鍵查找對應的數據
有多少行沒有在緩存這個sql就要執行多少次。如果Hql不相同
,不利用緩存。
2、iterator初始執行時先取出所有主鍵值,再根據主鍵值查找具體的
對象。所以如果沒有緩存,其初次執行會執行"行數+1"個sql。
如果緩存中有,可以直接取緩存的數據不管hql相同還是不相同。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -