事务的编写规范与Hibernate绑定session
一、事务的编写规范
1、事务的基本概念:
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性
单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使
应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的一个逻辑工作单
位,由DBMS中的事务管理子系统负责事务的处理。
5、事务的规范代码结构
try { //开启事物 //操作数据 //提交事物 } catch (Exception e) { // 事务回滚 }finally{ //释放资源 }
6、规范代码示例
@Test public void test8(){ SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { //开启事物 sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); //操作数据 UserEntity user1 = session.get(UserEntity.class, 2); System.out.println(user1); //提交事物 tx.commit(); } catch (Exception e) { // 事务回滚 tx.rollback(); }finally{ //释放资源 session.close(); sessionFactory.close(); } }
二、Hibernate绑定session
1、session类似于JDBC中的Connection连接。
2、绑定session,底层是使用threadLoacl.
3、绑定原因:session是单线程的,一个session只能被一个线程使用,绑定后可以防止一个session被多个线程使用,出现异常。
4、绑定步骤:
(1)在核心配置文件中进行配置(必须要配置)
<!-- 在hibernate核心配置文件中配置 --> <property name="hibernate.current_session_context_class">thread</property>
(2)编写代码:
@Test public void test9(){ SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.getCurrentSession(); tx = session.beginTransaction(); UserEntity user1 = session.get(UserEntity.class, 2); System.out.println(user1); tx.commit(); } catch (Exception e) { tx.rollback(); }finally{ sessionFactory.close(); } }
5、使用该绑定线程在结束后不需要手动关闭该session,该session会随着线程的结束而自动关闭。
验证自动关闭
代码:
@Test public void test10(){ SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.getCurrentSession(); tx = session.beginTransaction(); UserEntity user1 = session.get(UserEntity.class, 2); System.out.println(user1); tx.commit(); } catch (Exception e) { tx.rollback(); }finally{ session.close(); sessionFactory.close(); } }
结果:测试出现异常,提示该session已经被关闭。