###悲观锁###
1、创建数据库表
2、添加数据
1 tom 20
3、建立web项目
建立相应的类:
public class User {
private Integer id;
private String username;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
建立User.hbm.xml文件
<hibernate-mapping>
<class name="pink.User" table="user">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="username" type="java.lang.String">
<column name="username" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
</class>
</hibernate-mapping>
创建hibernate.cfg.xml文件
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/test
</property>
<property name="hibernate.connection.username">root
</property>
<property name="hibernate.connection.password">root
</property>
<property name="hibernate.show_sql">true
</property>
<property name="format_sql">true
</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</property>
<mapping resource="pink/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
建立HibernateUtils.java获取Session实例
public class HibernateUtils {
private static final Configuration config;
private static final SessionFactory factory;
static{
config=new Configuration().configure();
factory=config.buildSessionFactory();
}
public static Session getSession(){
return factory.openSession();
}
}
建立测试类UserTest.java
public void test(){
Session session=HibernateUtils.getSession();
Transaction tx=session.beginTransaction();
User user=(User)session.get(User.class, 1);
System.out.println(user.getId()+" "+user.getUsername()+" "+user.getAge());
tx.commit();
session.close();
}
@Test
public void test2(){
Session session=HibernateUtils.getSession();
Transaction tx=session.beginTransaction();
User user=(User)session.get(User.class, 1);
user.setUsername("link");
session.save(user);
tx.commit();
session.close();
}
@Test
public void test3(){
Session session=HibernateUtils.getSession();
Transaction tx=session.beginTransaction();
User user=(User)session.get(User.class, 1);
user.setAge(30);
session.save(user);
tx.commit();
session.close();
}
4、进行测试
导入Junit包,在test2与test3的user.setXXX("")处添加断点
,test2()方法处进行debug As JUint Test,F6单步执行到commit()处,
然后如test2一样执行test3()
对于test2()方法,按Resume执行完成,数据库值改变
1 link 20
对于test3()同样执行如上,数据库值为
1 tom 30
即test2()的执行没有保存添加:
User user=(User)session.get(User.class,1,LoacMode.UPGRADE)
数据库值如test2()执行后的值,而test3()的不到执行
5、乐观锁设置
在数据库表添加version字段,在User类中添加属性及setter与getter方法,设置User.hbm.xml文件,在id后加入:
<version name="version" column="version" type="integer"/>
测试结果
会执行test2()并改变version值,当执行test3()会抛出异常
只会保存test2()执行结果
6、悲观锁与乐观锁
悲观锁会锁定数据,其他方法无法对该数据修改,而乐观锁是通过version的值
判断该数据是否被更改,若更改,其他修改将得不到执行,会抛出异常