hibernate annotation 处理并发非常特别,只要设置乐观锁,并发操作不会发生冲突。
alias.java:
@Version
@Column(name="version",nullable=false,unique=true)
private int version;
Test.java:
void updateEntity() {
//测试乐观锁
Session session1=sf.openSession();
Session session2=sf.openSession();
Transaction tx1 = session1.beginTransaction();
Transaction tx2 = session2.beginTransaction();
try{
Alias ao1 = (Alias) session1.load(Alias.class, new Long(3));
Alias ao2 = (Alias) session2.load(Alias.class, new Long(3));
//这时候,两个版本号是相同的
ao1.setAmoney(ao1.getAmoney()+10);
tx1.commit();
//这时候,两个版本号是不相同的
ao2.setAmoney(ao2.getAmoney()-10);
tx2.commit();
System.out.println("OK!");
}catch(Exception e){
System.out.println(e);
if(tx2 != null)//有同步数据库的作用
{
tx2.rollback();
//updateEntity2();
}
else if(tx1 != null)//有同步数据库的作用
{
tx1.rollback();
//updateEntity2();
}
}finally{
session1.close();
session2.close();
}
}
前后结果对比: