事务的成功取决于工作单元的所有SQL语句都执行成功,它必须具备ACID特征,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和持久性(Durability),它们的含义是:
(1) 原子性:事务是不可分割的工作单元,事务中所有操作执行成功事务才算成功
(2) 一致性:事务不能破坏数据的完整性和一致性(正确性)
(3) 隔离性:在并发环境中,事务是独立的,它不依赖其他事务也能完成任务
(4) 持久性:只要事务成功执行,数据永久保存下来
声明事务边界
数据库系统支持以下两种事务模式:
(1)自动提交模式:每一个SQL语句都是一个独立的事务,如果执行成功就自动提交,否之 自动回滚
(2)手工提交模式:由程序显式指定事务边界
通过Hibernate API声明事务边界
Hibernate API封装了JDBC API和JTA API.应用程序可以绕过Hibernate API直接通过 JDBC API和JTA 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中,Session和Transaction类提供了以下声明事务的方法:
(1) Transaction tx=session.beginTransaction();//开始事务
(2) tx.commit();//提交事务,调用flush()方法清理缓存,然后提交事务
(3) tx.rollback();//撤销事务
要注意的内容
1.尽量让一个Session对应一个事务,不管事务成功与否最后要关闭Sessin,让其清空 缓存,释放占用的连接;如果事务仅包含只读(select)操作,也应在执行成功后提交事务, 让数据库释放事务所占的资源.如:
- Session session=sessionFactory.openSession();
- Transaction tx;
- try{
- tx=session.beginTransaction();//开始一个事务
- ….//执行一些操作
- tx.commit();//提交事务
- }catch(Exception e){
- tx.rollback();//撤销事务。这个语句也要捕获异常,代码略
- }finally{
- session.close();//撤销事务。这个语句也要捕获异常,代码略
- }
2.一个Session可以对应多个事务,这种方式优点中重用缓存中的持久化对象,如:
- try{
- tx1=session.beginTransaction();
- ….//执行一些操作
- tx1.commit();//提交事务
- session.desconnect();//释放数据连接
- ….//执行一些操作,这些操作不属于任何事务
- session.reconnnect();//重新获得数据库连接
- tx2=session.beginTranction();//开始第二个事务
- ….// 执行一些操作
- tx2.commit();//提交第二个事务
- }catch(Exception e){
- if(tx1!=null)tx1.rollback();
- if(tx2!=null)tx2.rollback();
- }finally{
- session.close();
- }
其中还有JDBC还有MySQL如何处理事务的方式。都是分为手工和自动两种。
参考:https://blog.csdn.net/jazywoo123/article/details/7843290
如何session绑定到当前线程?
配置文件中添加属性:
工具类中添加一个创建session的方法,
UserDao层:
服务层:写一个save函数。