|
章主要講述并發(fā)的幾種情況、數(shù)據(jù)庫(kù)鎖的種類,事務(wù)如何通過(guò)隔離級(jí)別處理并發(fā)。以及Hibernate提供了哪些方法來(lái)處理并發(fā)問(wèn)題
數(shù)據(jù)庫(kù)事務(wù)與并發(fā)
概述:事務(wù)通過(guò)隔離級(jí)別控制鎖的形式來(lái)處理數(shù)據(jù)的并發(fā)問(wèn)題。
為什么事務(wù)能夠處理并發(fā)問(wèn)題?
答:事務(wù)的特性決定它能夠處理并發(fā)問(wèn)題:一致性、隔離性、持久性、原子性
數(shù)據(jù)的并發(fā)有哪些情況?
答:
一、后發(fā)生的事務(wù)影響前面的事務(wù)
1、第一類更新丟失:后發(fā)生的事務(wù)回滾覆蓋了前面提交成功的事務(wù)
2、臟讀:后發(fā)生的事務(wù)成功提交覆蓋了前面的回滾的事務(wù)
3、第二類更新丟失:后發(fā)生的事務(wù)成功提交覆蓋了前面的成功提交的事務(wù)
二、后發(fā)生的事務(wù)受到前面的事務(wù)的影響
1、虛讀:后一個(gè)事務(wù)在前后兩次讀取數(shù)據(jù)時(shí)由于前面的已提交的事務(wù)進(jìn)行了插入操作,
而使數(shù)據(jù)統(tǒng)計(jì)前后不一致。
2、不可重復(fù)讀:后一個(gè)事務(wù)在對(duì)同一條數(shù)據(jù)前后兩次讀取時(shí)由于前面的已提交的事務(wù)
進(jìn)行了對(duì)這條數(shù)據(jù)更新操作,而使數(shù)據(jù)前后不一致。
事務(wù)如何處理并發(fā)問(wèn)題?
答:
事務(wù)通過(guò)鎖來(lái)處理并發(fā)問(wèn)題一般有兩種方式:
悲觀鎖:通過(guò)數(shù)據(jù)庫(kù)系統(tǒng)的鎖來(lái)處理并發(fā)
樂(lè)觀鎖:通過(guò)應(yīng)用程序邏輯處理并發(fā)
悲觀鎖的種類有哪些?
答:
一、共享鎖:用于讀數(shù)據(jù)操作。
特性:
1、加鎖條件:當(dāng)一個(gè)事務(wù)執(zhí)行select語(yǔ)句時(shí)數(shù)據(jù)庫(kù)系統(tǒng)會(huì)為這個(gè)事務(wù)分配一把共享鎖,來(lái)鎖定被查詢的記錄。
2、解鎖條件:讀取完畢則釋放共享鎖。
3、兼容性:如果數(shù)據(jù)資源上已經(jīng)放了共享鎖還可放共享鎖和更新鎖。
4、并發(fā)性能:具有良好的并發(fā)性能。
二、更新鎖:在更新操作的初始化階段用來(lái)鎖定可能要被修改的資源,避免使用共享鎖造成的死鎖問(wèn)題。
特性:
1、加鎖條件:當(dāng)一個(gè)事務(wù)執(zhí)行update語(yǔ)句時(shí),數(shù)據(jù)庫(kù)系統(tǒng)會(huì)先為事務(wù)分配一個(gè)更新鎖。
2、解鎖條件:當(dāng)讀取數(shù)據(jù)完畢,進(jìn)行更新操作時(shí)將更新鎖升級(jí)為獨(dú)占鎖。
3、兼容性:與共享鎖兼容。一個(gè)數(shù)據(jù)資源上可以有多個(gè)共享鎖和一個(gè)更新鎖。
4、允許多個(gè)事務(wù)同時(shí)讀鎖定的資源,但不允許其它事務(wù)修改它。
三、獨(dú)占鎖:修改數(shù)據(jù)時(shí)使用獨(dú)占鎖。
特性:
1、加鎖條件:當(dāng)執(zhí)行update、delete、insert操作時(shí)數(shù)據(jù)庫(kù)系統(tǒng)會(huì)為數(shù)據(jù)資源使用獨(dú)占鎖。如果該資源上已經(jīng)有其它鎖
存在時(shí)則無(wú)法放置獨(dú)占鎖
2、解鎖條件:獨(dú)占鎖一直到事務(wù)結(jié)束才能被解除。
3、兼容性:獨(dú)占鎖不能和其它鎖兼容。
4、并發(fā)性:并發(fā)性能較差。
事務(wù)如何控制鎖的形式?
答:事務(wù)通過(guò)事務(wù)的隔離級(jí)別來(lái)控制鎖的形式。
事務(wù)級(jí)別有哪些?并發(fā)情況怎樣?
答:
在應(yīng)用程序中如何使用樂(lè)觀鎖:
答:一般在數(shù)據(jù)庫(kù)表中增加Version或者是TimeStamp字段,根據(jù)讀取時(shí)以及在進(jìn)行修改操作時(shí)Version或者TimeStamp的值不同來(lái)控制并發(fā)問(wèn)題。
Hibernate是如何處理并發(fā)問(wèn)題的:
答:
一、Hibernate在讀取數(shù)據(jù)時(shí)通過(guò)設(shè)置鎖定模式來(lái)控制悲觀鎖的形式
二、Hibernate在映射文件中使用樂(lè)觀鎖處理并發(fā)問(wèn)題
1、<version>元素:此元素指定的字段,每進(jìn)行一次操作就自動(dòng)加1,在進(jìn)行讀取和修改操作時(shí)如果version值不相同則拋出異常,交給應(yīng)用程序處理。
2、<timestamp>元素:此元素指定的字段數(shù)據(jù),每進(jìn)行一次操作就更新成當(dāng)前時(shí)間。由于當(dāng)前時(shí)間精確到妙所以在處理并發(fā)問(wèn)題的精確性上沒有<version>好。
注意:這兩個(gè)元素在使用時(shí)都要緊跟在<id>元素后面。
3、對(duì)于現(xiàn)有的數(shù)據(jù)庫(kù)表不包含version或者timestamp字段,要處理并發(fā)問(wèn)題可以在<class>元素上進(jìn)行如下設(shè)置:
<class name=”Account” table=”Accounts” optimistic-lock=”all” dynamic-update=”true”>
|
|
|
來(lái)自: EverestSnow > 《java》