Hibernate的事務(wù):事務(wù)對象的方法
Hibernate在發(fā)送Sql把對象信息同步到數(shù)據(jù)時,不是立即進(jìn)行的而是把這些要發(fā)送的Sql緩存在起來,在必要的時候發(fā)送。
通過Session的setFlushMode(FlushMode flushMode)方法,來控制在什么時候清空Sql的緩沖區(qū),并把緩存的Sql語句發(fā)送出去。
FlushMode是一個枚舉,它有3個枚舉值。
FlushMode.AUTO,在持久化對象的信息被修改時,那么就要把它同步到數(shù)據(jù)庫中,更新數(shù)據(jù)庫中隊?wèi)?yīng)的記錄,也就是在產(chǎn)生修改時就會清空緩沖區(qū)。
FlushMode.COMMIT,只有在事務(wù)提交的時候才清空緩沖區(qū)。
FlushMode.NEVER,這個值表示只有在調(diào)用了Session的flush()方法才清空緩沖區(qū)。
Hibernate的事務(wù)保證原子操作的不可分,也就是操作的同時成功或同時失敗。
Transaction tran=session.beginTranaction();
tran.commit();
tran.rollback();
以上是Hibernate的事務(wù)對象的方法,來實現(xiàn)對事務(wù)的支持。
hibernate的事務(wù)隔離級別
hibernate的事務(wù)隔離級別和JDBC中大致相同。
設(shè)置時要在hibernate.cfg.xml配置
< property name="hibernate.connection.isolation">4< /property>
1,讀未提交的數(shù)據(jù)(Read uncommitted isolation)
2,讀已提交的數(shù)據(jù)(Read committed isolation)
4,可重復(fù)讀級別(Repeatable read isolation)
8,可串行化級別(Serializable isolation)
hibernate的鎖(悲觀鎖,樂觀鎖)
悲觀鎖是由數(shù)據(jù)庫本身所實現(xiàn)的,會對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行鎖定,也就是鎖行。
LockMode.UPGRADE,修改鎖,在get()方法中加上這個設(shè)置作為第三個參數(shù)。
LockMode.NONE 無鎖機(jī)制
LockMode.READ 讀取鎖
LockMode.WRITE 寫入鎖,不能在程序中直接使用
還可以使用Session.lock() Query.setLockMode() Criteria.setLockMode()方法來設(shè)置鎖
樂觀鎖,也就是通過對記錄加上某些信息來解決并發(fā)訪問的問題。
版本檢查
要在其表中多加上一個字段表示版本信息,會在讀取時讀到這個版本號,并在修改之后更新這個版本號,在并發(fā)修改的時,只有數(shù)據(jù)庫中記錄的版本號比要更新的才進(jìn)行更新操作,如果數(shù)據(jù)庫記錄版本號比要更新的高,就會拋出例外。
寫在Xxxxx.hbm.xml中
< version name="version" column="version" type="integer" />
例:
- public class User implements Serializable{
- private int id;
- private String name;
- private String phone;
- private int version;//記錄版本的屬性
- public int getId(){
- return id;
- }
- public void setId(int id){
- this.id = id;
- }
- public String getName(){
- return name;
- }
- public void setName(String name){
- this.name = name;
- }
- public String getPhone(){
- return phone;
- }
- public void setPhone(String phone){
- this.phone = phone;
- }
- public int getVersion(){
- return version;
- }
- public void setVersion(int version){
- this.version = version;
- }
- }
User類的User.hbm.xml文件
- < hibernate-mapping package="alan.hbn.concur.version" auto-import="false">
- < class name="User" table="user_version">
- < id name="id" column="id" type="integer" unsaved-value="0">
- < generator class="native"/>
- < /id>
- < version name="version" column="version" type="integer" />
- < !--版本控制,指定了版本屬性的名字,和對應(yīng)表中的字段和類型-->
- < property name="name" column="name"/>
- < property name="phone" column="phone"/>
- < /class>
- < /hibernate-mapping>
【編輯推薦】