Hibernate 事务处理

事务是指由一个或者多个SQL语句组成的工作单元,这个单元中SQL语句只要有一个SQL语句执行失败,就会撤销整个工作单元。

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

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

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

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

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

2声明事务边界

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

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

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

mysql.exe程序中声明事务

(1)    在自动提交模式下运行事务

       每一个SQL语句就是一个独立的事务,由系统自动提交和回滚,:

       insert into ACCOUNTS values(1,’Tom’,10000)

(2)    手工提交模式下运行事务

       手工提交模式,必须显式指定事务边界

1.       开始事务:begin transaction

2.       提交事务:commit transaction

3.       回滚(撤销)事务:rollback transaction

如以下的银行转帐事务

begin transaction

set @errorSum=0

update bank set currentMoney=currentMoney-1000 where customerName=’张三

set @errorSum=@errorSum+@@error--@@error是系统的全局变量.

update bank set currentMoney=currentMoney+1000 where customerName=’李四

set @errorSum=@errorSum+@@error

if @errorSum<>0

       rollback transaction

else

       commit transaction

通过JDBC API声明事务边界

       java.sq.Connection类提供了以下用于控制事务的方法

(1)    setAutoCommit(boolean autoCommit):设置是事自动提交事务

(2)    commit():提交事务

(3)    rollback():撤销事务

try{
con.setAutoCommit(false);//设置为手工提交模式
stmt=con.createStatement();
stmt.executeUpdate(“update ACCOUNTS set BALANCE=1000-100 where ID=1”);
stmt.executeUpdate(update ACCOUNTS set BALANCE=0+100 where ID=2”)
con.commit();//提交事务
}catch(SQLException e){
       con.rollback();//不成功就撤销事务.这语句也要捕获异常,代码略
}finally{
       stmt.close();
       con.close();//.这语句也要捕获异常,代码
}

通过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)操作,也应在执行成功后提交事务,       让数据库释放事务所占的资源.:     

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();
       }

       注意:在一个事务没提交之前,不可以开始第二个事务(不允许的);如果Session的一个 事务出现了异常,就应关闭这个Session。如果仍然用它执行其他事务是不可取的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值