一、事务的编写规范

  1、事务的基本概念:

     数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性

     单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使

     应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的一个逻辑工作单

     位,由DBMS中的事务管理子系统负责事务的处理。

  2、特性:
    原子性、一致性、隔离性和持久性。
  3、不考虑隔离性会出现的问题。
    (1)脏读
    (2)不可重复读
    (3)虚读
  4、设置事务的隔离性
    (1)Read Uncommitted :1级。允许你读取还未提交的已经改变的数据。可能导致脏读、虚读、不可重复读问题。
    (2)Read Committed:2级。允许在并发事务已经提交后读取。可以防止脏读,但虚读和不可重复读仍有可能发生。
    (3)Repeatable Read:4级。对相同字段的多次读取是一致的,除非数据被事务本身改变。但虚读还是有可能出现。
    (4)serializable  :8级。完全服从AIDC的隔离原则,确保不发生脏读、虚读和不可重复读。

  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已经被关闭。

        

最新文章

  1. pod的SDK报错,Linker command failed with exit code1(use -v to see invocation)
  2. maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器
  3. MPlayer-2016 最新版本
  4. 深入Python(4):深拷贝和浅拷贝
  5. PHP event 事件机制
  6. AIR for IOS开发问题小结
  7. LR_问题_运行场景时提示scripts you are running in invalid
  8. Android(java)学习笔记137:Android中SimpleAdapter,ArrayAdapter和BaseAdapter常见的适配器
  9. 当浏览器不支持placeholder,所执行的函数
  10. HDU 3478 Play with Chain (Splay树)
  11. ES6基础语法
  12. java将所有的字符串转换为大写或小写
  13. web应用 与 http协议
  14. POI 导出
  15. Mac android studio 一直卡在Gradle:Build Running的解决办法
  16. 《剑指offer》-表示数值的字符串
  17. c语言cgi笔记
  18. IntelliJ IDEA 2017版 spring-boot搭建拦截器
  19. tab切换webuploader失效的解决方法
  20. OpenGL入门程序一:绘制简单的矩形

热门文章

  1. Centos7 因内存 可用大小不足,被killed的解决办法
  2. c#设计模式系列:命令模式(Command Pattern)
  3. 基于GOJS绘制流程图
  4. Linux中Consul集群部署
  5. Windows上编译OpenImageIO
  6. 《Beginning Java 7》 - 3 - Equalty 判等
  7. day05.1-文件处理
  8. POJ - 1251A - Jungle Roads 利用最小生成树
  9. Laravel 集成 JPush 极光推送指北
  10. BZOJ1721 Ski Lift 缆车支柱