Hibernate ----- 事物的深入理解



 

事务的成功取决于工作单元的所有SQL语句都执行成功,它必须具备ACID特征,ACIDAtomic(原子性)Consistency(一致性)Isolation(隔离性)和持久性(Durability),它们的含义是:

(1)    原子性:事务是不可分割的工作单元,事务中所有操作执行成功事务才算成功

(2)    一致性:事务不能破坏数据的完整性和一致性(正确性)

(3)    隔离性:在并发环境中,事务是独立的,它不依赖其他事务也能完成任务

(4)    持久性:只要事务成功执行,数据永久保存下来




声明事务边界

       数据库系统支持以下两种事务模式:

       (1)自动提交模式:每一个SQL语句都是一个独立的事务,如果执行成功就自动提交,否之  自动回滚

       (2)手工提交模式:由程序显式指定事务边界


通过Hibernate API声明事务边界

       Hibernate API封装了JDBC APIJTA API.应用程序可以绕过Hibernate API直接通过    JDBC APIJTA API来声明事务,但是这不利于跨平台开发

       SessionFactory中获得Session实例有两种方式:

       (1)Session session=sessionFactory.openSession();//从连接池中获得连接,并把连接设为手工提交事务模式

       (2)Connection con=DriverManager.getConnection(url,user,pwd);//这种方式绕过Hibernate

              con.setAutoCommit(false);

              Session session=sessionFactory.openSession(con);


       Hibernate API,SessionTransaction类提供了以下声明事务的方法:

(1)    Transaction tx=session.beginTransaction();//开始事务

(2)    tx.commit();//提交事务,调用flush()方法清理缓存,然后提交事务

(3)    tx.rollback();//撤销事务

       要注意的内容

       1.尽量让一个Session对应一个事务,不管事务成功与否最后要关闭Sessin,让其清空 缓存,释放占用的连接;如果事务仅包含只读(select)操作,也应在执行成功后提交事务,       让数据库释放事务所占的资源.:     

[java] view plain copy
  1. Session session=sessionFactory.openSession();  
  2.        Transaction tx;  
  3.        try{  
  4.               tx=session.beginTransaction();//开始一个事务  
  5.               ….//执行一些操作  
  6.               tx.commit();//提交事务  
  7.        }catch(Exception e){  
  8.               tx.rollback();//撤销事务。这个语句也要捕获异常,代码略  
  9.        }finally{  
  10.               session.close();//撤销事务。这个语句也要捕获异常,代码略  
  11.        }  

       2.一个Session可以对应多个事务,这种方式优点中重用缓存中的持久化对象,如:

[java] view plain copy
  1. try{  
  2.             tx1=session.beginTransaction();  
  3.             ….//执行一些操作  
  4.             tx1.commit();//提交事务  
  5.             session.desconnect();//释放数据连接  
  6.             ….//执行一些操作,这些操作不属于任何事务  
  7.             session.reconnnect();//重新获得数据库连接  
  8.             tx2=session.beginTranction();//开始第二个事务  
  9.             ….// 执行一些操作  
  10.             tx2.commit();//提交第二个事务  
  11.      }catch(Exception e){  
  12.             if(tx1!=null)tx1.rollback();  
  13.             if(tx2!=null)tx2.rollback();  
  14.      }finally{  
  15.             session.close();  
  16.      }  

其中还有JDBC还有MySQL如何处理事务的方式。都是分为手工和自动两种。

参考:https://blog.csdn.net/jazywoo123/article/details/7843290



如何session绑定到当前线程?

配置文件中添加属性:


工具类中添加一个创建session的方法,


UserDao层:


服务层:写一个save函数。






猜你喜欢

转载自blog.csdn.net/qq_36098284/article/details/80094923