【hibernate框架】使用hibernate实现悲观锁和乐观锁
摘要: 四种隔离机制不要忘记:(1,2,4,8) 1.read-uncommitted:能够去读那些没有提交的数据(允许脏读的存在) 2.read-committed:不会出现脏读,因为只有另一个事务提交才会读取来 结果,但仍然会出现不可重复读和幻读现象。
package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Account { private int id; private int balance; //BigDecimal @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } }
<mapping class="com.bjsxt.hibernate.Account"/>
@Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); Account a = new Account(); a.setBalance(100); session.save(a); session.getTransaction().commit(); session.close(); } @Test public void testOperation1() { Session session = sf.openSession(); session.beginTransaction(); Account a = (Account)session.load(Account.class, 1); int balance = a.getBalance(); //do some caculations balance = balance - 10; //在保存时很有可能会把在同一时期修改的给覆盖掉 //这个时候上一把"锁"就可以避免这个问题 a.setBalance(balance); session.getTransaction().commit(); session.close(); } //下面这个就是对上面那个例子做的修改 @Test public void testPessimisticLock() { Session session = sf.openSession(); session.beginTransaction(); //给它加把锁,加锁的机制上面已经提到了 Account a = (Account)session.load(Account.class, 1, LockMode.UPGRADE); int balance = a.getBalance(); //do some caculation balance = balance - 10; a.setBalance(balance); session.getTransaction().commit(); session.close(); }这是依赖于数据库的锁的,也就是给数据库一个指令,要求数据库帮忙加锁。
package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Version; @Entity public class Account { private int id; private int balance; private int version; @Version//加了这个注解就说明这个是专门用来做版本标注的 public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } }
@Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); Account a = new Account(); a.setBalance(100); session.save(a); session.getTransaction().commit(); session.close(); } @Test public void testOptimisticLock() { Session session = sf.openSession(); Session session2 = sf.openSession(); session.beginTransaction(); Account a1 = (Account) session.load(Account.class, 1); session2.beginTransaction(); Account a2 = (Account) session2.load(Account.class, 1); a1.setBalance(900); a2.setBalance(1100); //第一个session一旦提交,version就会+1 session.getTransaction().commit(); System.out.println(a1.getVersion()); //第二个session提交的时候,一看version不一样就会报错 //出了错误做个记录,下次再提交(也可以用其他方法) session2.getTransaction().commit(); System.out.println(a2.getVersion()); session.close(); session2.close(); }
乐观锁,没出事就好,出了事我再想办法解决。
转载请注明出处:http://blog.csdn.net/acmman/article/details/44176281
用云栖社区APP,舒服~
网友评论