Hibernate 事务处理和spring中配置事务

来源:互联网 发布:linux下载gcc 编辑:程序博客网 时间:2024/05/19 18:45

原文链接:http://blog.csdn.net/sd0902/article/details/8393700

1.非集成spring事务管理

 

事务是指由一个或者多个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():撤销事务

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

通过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 plaincopy
  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 plaincopy
  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.      }  

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

 

2.集成spring事务管理

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!-- 指定Spring配置文件的Schema信息 -->  
  4. <beans xmlns="http://www.springframework.org/schema/beans"  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.     xmlns:aop="http://www.springframework.org/schema/aop"  
  7.     xmlns:p="http://www.springframework.org/schema/p"  
  8.     xmlns:tx="http://www.springframework.org/schema/tx"  
  9.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  10.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  11.     http://www.springframework.org/schema/tx   
  12.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  13.     http://www.springframework.org/schema/aop   
  14.     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"  
  15.     default-autowire="byName">  
  16.   
  17.   
  18.     <!-- 定义数据源Bean,使用C3P0数据源实现 -->  
  19.     <!-- 设置连接数据库的驱动、URL、用户名、密码  
  20.         连接池最大连接数、最小连接数、初始连接数等参数 -->  
  21.     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  22.         destroy-method="close"  
  23.         p:driverClass="com.mysql.jdbc.Driver"  
  24.         p:jdbcUrl="jdbc:mysql://localhost:3306/sshweb?useUnicode=true&characterEncoding=utf-8"  
  25.         p:user="root"  
  26.         p:password="123456"  
  27.         p:maxPoolSize="40"  
  28.         p:minPoolSize="1"  
  29.         p:initialPoolSize="1"  
  30.         p:maxIdleTime="20"/>  
  31.   
  32.     <!-- 定义Hibernate的SessionFactory -->  
  33.     <!-- 依赖注入数据源,注入正是上面定义的dataSource -->  
  34.     <bean id="sessionFactory"  
  35.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"  
  36.         p:dataSource-ref="dataSource">  
  37.         <!-- mappingResouces属性用来列出全部映射文件 -->  
  38.         <!--<property name="mappingResources">  
  39.             <list>  
  40.                 <value>com/model/Novel.hbm.xml</value>  
  41.                 <value>com/model/NovelType.hbm.xml</value>  
  42.             </list>  
  43.         </property>-->  
  44.         <property name="mappingLocations">  
  45.             <list>  
  46.                  <value>classpath:com/model/mapping/*.hbm.xml</value>  
  47.             </list>  
  48.         </property>  
  49.   
  50.         <!-- 定义Hibernate的SessionFactory的属性 -->  
  51.         <property name="hibernateProperties">  
  52.             <!-- 指定数据库方言、是否自动建表  
  53.                 是否生成SQL语句等  -->  
  54.             <value>  
  55.             hibernate.dialect=org.hibernate.dialect.MySQLDialect  
  56.             hibernate.hbm2ddl.auto=update  
  57.             hibernate.show_sql=true  
  58.             hibernate.connection.characterEncoding=UTF-8  
  59.   
  60.               
  61. <!--         hibernate.format_sql=true-->  
  62. <!--         #开启二级缓存-->  
  63. <!--         hibernate.cache.use_second_level_cache=true-->  
  64. <!--         #设置二级缓存的提供者-->  
  65. <!--         hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider-->  
  66.             </value>  
  67.         </property>  
  68.     </bean>  
  69.   
  70.     <!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 -->  
  71.     <!-- 该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现-->  
  72.     <!-- 并注入SessionFactory的引用 -->  
  73.     <bean id="transactionManager" class=  
  74.         "org.springframework.orm.hibernate3.HibernateTransactionManager"  
  75.         p:sessionFactory-ref="sessionFactory"/>  
  76.   
  77.     <!-- 配置事务增强处理Bean,指定事务管理器 -->  
  78.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  79.         <!-- 用于配置详细的事务语义 -->  
  80.         <tx:attributes>  
  81.             <!-- 所有以'get'开头的方法是read-only的 -->  
  82.             <tx:method name="get*" read-only="true"/>  
  83.             <!-- 其他方法使用默认的事务设置 -->  
  84.             <tx:method name="*"/>  
  85.             <!--不需要事务管理的-->  
[html] view plaincopy
  1. <tx:method name="get*" read-only="false" propagation="NOT-SUPPORTED"/>  
[html] view plaincopy
  1. </tx:attributes>  
  2. </tx:advice>  
  3. <aop:config proxy-target-class="true">  
  4.     <!-- 配置一个切入点,匹配empManager和mgrManager  
  5.         两个Bean的所有方法的执行 -->  
  6.     <aop:pointcut id="pointcut"  
  7.         expression="execution(* com.service.*.*(..))" />  
  8.     <!-- 指定在leePointcut切入点应用txAdvice事务增强处理 -->  
  9.     <aop:advisor advice-ref="txAdvice"   
  10.         pointcut-ref="pointcut"/>  
  11. </aop:config>  
  12.   
  13.   
  14. <!-- 装配HibernateTemplate实例   
  15. <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">  
  16.     <constructor-arg ref="sessionFactory"/>  
  17. </bean> -->  
  18.   
  19. lt;/beans>

0 0
原创粉丝点击