Hibernate中事务
- 事务的性质
- 事物的隔离级别
- 配置事务的隔离级别
事务的性质
原子性:原子,不可再分,一个操作不能分为更小的操作,要么全都执行,要么全不执行。
一致性:事务在完成时,必须使得所有的数据保持一致的状态。(与开始事务保持前一样的状态)
隔离性:事务查看数据时数据所处的状态,要么是另一个并发事务修改它之前的状态,要么是另一并发事务修改它之后的状态,事务不会查看中间状态的数据。
持久性:事务完成之后,它对于系统的影响是永久性的。(执行了就执行了,没有撤回(悔棋)的说法)
事务的隔离级别
脏读:读取了未提交事务中的数据
不可重复复读:对于数据库中的某个数据,一个事务范围内多次读取同一个数据,却有不同的值
幻读:一个事务读到另一个事务新增加并提交的数据(insert)。在同一个事务中,对于同一组数据读取到的结果不一致
配置事务的隔离级别
读未提交: 最低的隔离级别,最没用(最快)
读已提交: 可避免脏读,不能避免不可重复读
可重复度: 可以避免不可重复读,可以避免脏读(mysql默认)
串行化: 最强大,三种都可以解决(最慢)
项目中在hibernate.cfg.xml配置事务的隔离级别【mysql数据库中默认是配置4:可重复读】
<!-- 配置数据库的隔离级别 1:读未提交: 最低的隔离级别,最没用(最快) 2:读已提交: 可避免脏读,不能避免不可重复读 4: 可重复度: 可以避免不可重复读,可以避免脏读(mysql默认) 8: 串行化: 最强大,三种都可以解决(最慢) --> <property name="hibernate.connection.isolation">4</property>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- 负责初始化 --> <session-factory> <!-- 连接数据库驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库地址 --> <property name="hibernate.connection.url">jdbc:mysql:///hibernatest</property> <!-- 数据库用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库密码 --> <property name="hibernate.connection.password">123456</property> <!-- 配置数据库的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 将hibernate生成的SQL语句打印到控制台上 --> <property name="hibernate.show_sql">true</property> <!-- 格式化hibernate生成的sql语句 --> <property name="hibernate.format_sql">true</property> <!-- hibernate自动创建表 create: 自动创建表,每次框架运行都会创建一张新的表,原来的数据将丢失(开发) create-drop: 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用) update(推荐): 自动生成表,如果表已经存在,则更新数据,如果表不存在,就会创建一张新的表 validate: 加载hibernate时,验证创建数据库表结构 --> <property name="hibernate.hbm2ddl.auto">create</property> <!-- 配置数据库的隔离级别 1:读未提交: 最低的隔离级别,最没用(最快) 2:读已提交: 可避免脏读,不能避免不可重复读 4: 可重复度: 可以避免不可重复读,可以避免脏读(mysql默认) 8: 串行化: 最强大,三种都可以解决(最慢) --> <property name="hibernate.connection.isolation">4</property> <mapping resource= "com/Gary/domain/User.hbm.xml"/> </session-factory> </hibernate-configuration>
实现HibernateUtils.java工具类:使用工厂模式将开启Hibernate事务代码提取出来
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.Gary.utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory sessionFactory = null; static { //得到配置信息 Configuration config = new Configuration().configure(); //获得sessionFactiory工厂 sessionFactory = config.buildSessionFactory(); } //获得全新的Session public static Session getSession() { ; //获取session Session session = sessionFactory.openSession(); return session; } public static Session getCurrentSession() { return sessionFactory.getCurrentSession(); } }
使用HibernateUtils.java打开事务
Session session = HibernateUtils.getSession(); //打开事务 Transaction transcation = session.beginTransaction();
使用HibernateUtils.java实现向数据库中用户注册事务
//增加用户 public void addUser(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 }