Hibernate中事务
事务的性质
事物的隔离级别
配置事务的隔离级别
事务的性质
原子性:原子,不可再分,一个操作不能分为更小的操作,要么全都执行,要么全不执行。
一致性:事务在完成时,必须使得所有的数据保持一致的状态。(与开始事务保持前一样的状态)
隔离性:事务查看数据时数据所处的状态,要么是另一个并发事务修改它之前的状态,要么是另一并发事务修改它之后的状态,事务不会查看中间状态的数据。
持久性:事务完成之后,它对于系统的影响是永久性的。(执行了就执行了,没有撤回(悔棋)的说法)
事务的隔离级别
脏读:读取了未提交事务中的数据
不可重复复读:对于数据库中的某个数据,一个事务范围内多次读取同一个数据,却有不同的值
幻读:一个事务读到另一个事务新增加并提交的数据(insert)。在同一个事务中,对于同一组数据读取到的结果不一致
配置事务的隔离级别
读未提交: 最低的隔离级别,最没用(最快)
读已提交: 可避免脏读,不能避免不可重复读
可重复度: 可以避免不可重复读,可以避免脏读(mysql默认)
串行化: 最强大,三种都可以解决(最慢)
项目中在hibernate.cfg.xml配置事务的隔离级别【mysql数据库中默认是配置4:可重复读】
4
/p>
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
com.mysql.jdbc.Driver
jdbc:mysql:///hibernatest
root
123456
org.hibernate.dialect.MySQLDialect
true
true
create
4
hibernate.cfg.xml
实现HibernateUtils.java工具类:使用工厂模式将开启Hibernate事务代码提取出来
packagecom.Gary.utils;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.Configuration;public classHibernateUtils {private static SessionFactory sessionFactory = null;static{//得到配置信息
Configuration config = newConfiguration().configure();//获得sessionFactiory工厂
sessionFactory =config.buildSessionFactory();
}//获得全新的Session
public staticSession getSession()
{
;//获取session
Session session =sessionFactory.openSession();returnsession;
}public staticSession getCurrentSession()
{returnsessionFactory.getCurrentSession();
}
}
HibernateUtils.java
使用HibernateUtils.java打开事务
Session session =HibernateUtils.getSession();//打开事务
Transaction transcation = session.beginTransaction();
使用HibernateUtils.java实现向数据库中用户注册事务
//增加用户
public voidaddUser(User user) {
Session session=HibernateUtils.getSession();//打开事务
Transaction transcation =session.beginTransaction();//存储user对象save 只是为了生成id//有id,与session有关联,持久化状态//存储user对象
session.save(user); //有id,与session关联 持久化状态 本质:对象状态的转换//将瞬时->持久 目的:生成id//提交事务
transcation.commit();//关闭资源
session.close(); //没有与session关联,有id
}