SSH与SSM学习之hibernate12——hibernate中的事务

来源:互联网 发布:2016年实体店倒闭数据 编辑:程序博客网 时间:2024/06/03 17:12

  • SSH与SSM学习之hibernate12hibernate中的事务
    • 一事务
      • 1 事务特性
      • 2 事务并发问题
      • 3 事务隔离级别
    • 二如何在hibernate中指定数据库的隔离级别
    • 三在项目中如何管理事务
      • 1 管理事务说明
      • 2 getCurrentSession 使用说明
    • 四service和dao实例
      • 1 CustomerDaoImpl
      • 2 CustomerServiceImpl

SSH与SSM学习之hibernate12——hibernate中的事务

一、事务

1.1 事务特性

原子性

一致性

隔离性

持久性

1.2 事务并发问题

脏读

不可重复度

幻|虚读

1.3 事务隔离级别

读未提交(脏读、不可重复度、幻|虚读)

读已提交(不可重复度、幻|虚读)

可重复读(mysql默认级别)(幻|虚读)

串行化 - 没有问题


二、如何在hibernate中指定数据库的隔离级别

配置事务的隔离级别,需要在hibernate的主配置文件hibernate.cfg.xml中添加如下的配置

<!-- 指定hibernate操作数据库时的隔离级别    #hibernate.connection.isolation 1|2|4|8    0001    1   读未提交    0010    2   读已提交    0100    4   可重复读    1000    8   串行化--><property name="hibernate.connection.isolation">4</property>

三、在项目中如何管理事务

3.1 管理事务说明

  1. 业务开始之前打开事务,业务执行之后提交事务. 执行过程中出现异常.回滚事务.

  2. 在dao层操作数据库需要用到session对象.在service控制事务也是使用session对象完成. 我们要确保dao层和service层使用的使用同一个session对象

  3. 在hibernate中,确保使用同一个session的问题,hibernate已经帮我们解决了. 我们开发人员只需要调用sf.getCurrentSession()方法即可获得与当前线程绑定的session对象

3.2 getCurrentSession() 使用说明

  1. 调用getCurrentSession方法必须配合主配置中的一段配置
<!--指定session与当前线程绑定--><property name="hibernate.current_session_context_class">thread</property>
  1. 通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.

四、service和dao实例

4.1 CustomerDaoImpl

package com.qwm.hcrm.dao.impl;import com.qwm.hcrm.dao.CustomerDao;import com.qwm.hcrm.dmain.Customer;import com.qwm.hcrm.utils.HibernateUtils;import org.hibernate.Session;import org.hibernate.Transaction;/** * @author:qiwenming * @date:2017/9/17 0017   0:58 * @description: */public class CustomerDaoImpl implements CustomerDao{    @Override    public void save(Customer customer) {        //1.获取session        Session session = HibernateUtils.getCurrentSession();        //2.保存对象        session.save(customer);    }}

4.2 CustomerServiceImpl

package com.qwm.hcrm.service.impl;import com.qwm.hcrm.dao.CustomerDao;import com.qwm.hcrm.dao.impl.CustomerDaoImpl;import com.qwm.hcrm.dmain.Customer;import com.qwm.hcrm.service.CustomerService;import com.qwm.hcrm.utils.HibernateUtils;import org.hibernate.Session;import org.hibernate.Transaction;/** * @author:qiwenming * @date:2017/9/17 0017   1:02 * @description: */public class CustomerServiceImpl implements CustomerService{    private CustomerDao customerDao = new CustomerDaoImpl();    @Override    public void save(Customer customer) {        Session session = HibernateUtils.getCurrentSession();        //打开事务        Transaction t = session.beginTransaction();        try {            customerDao.save(customer);        }catch (Exception e){            e.printStackTrace();            t.rollback();        }        //提交事务        t.commit();    }}
阅读全文
0 0
原创粉丝点击