`

spring事务管理 数据库事务的4个特性

阅读更多

spring学习笔记:spring事务管理

数据库事务的4个特性:

 


    一致性(consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b账户相互转账之后,总金额不变;


    隔离性(isolation):操作中的事务不相互影响;


    持久性(durability):事务提交后被持久化到数据库.


  数据并发产生的问题:


    脏读:一个事物a读到了另一个事务b未提交的数据,则b回滚后,a读取的数据无效;


    不可重复读:一个事物a第二次读到了另一个事务b修改的数据;


    幻读:在统计数据的事务a两次统计的数据不一致(因为有其他事务新增数据)


    第一类丢失更新:a事务回滚覆盖了b事务提交的数据;


    第二类丢失更新:a事务覆盖了b事务提交的数据.


    事物隔离级别: READ_UNCOMMITED, READ_COMMITED, REPEATABLE_READ, SERIALIZABLE; 一般情况下READ_COMMITED足够了.


spring事务管理相关的接口:


    TransactionDefinition:代表一个事物,描述了事务的隔离级别, 超时时间,事务是否只读, 传播规则等等;


    TransactionStatus:描述事物的状态;


    PlatformTransactionManager:事务管理器接口, 只定义了3个方法:getTransaction()获取事务的状态; commit();rollback();


    事务管理器的实现类有多种,根据具体的持久层框架的不同而不同;


spring中的事务传播行为的种类:


    PROPAGATION_SUPPORTS: 如果已经存在事务,则加入事务;如果没有事务,则以非事务的方式执行;


    PROPAGATION_MANDATORY: 使用当前事务, 如果没有, 则抛出异常;


    PROPAGATION_REQUIRED_NEW: 新建事务,如果当前有事务, 则挂起;

    PROPAGATION_NOT_SUPPORTED:以非事务的方式执行, 如果当前有事务, 则挂起;


    PROPAGATION_NEVER:以非事务的方式执行, 如果当前有事务,则抛出异常;


使用spring声明式的事务管理:


    1 把dao,service注入到spring容器(这些dao, service不涉及事务);


    2 需要注入一个transactionManager(它需要dataSource);

    3 通过TransactionProxyFactoryBean为目标对象(需要事务的dao, service等等)提供事务增强,产生增强后的代理对象.


看代码:先添加一个CompanyService,

  1. package services;      
  2. import java.util.List;      
  3. import model.Company;      
  4. import dao.hibernate.CompanyDao;      
  5.      
  6. public class CompanyService {      
  7.  private CompanyDao companyDao;      
  8.  public CompanyDao getCompanyDao() {      
  9.   return companyDao;      
  10.  }      
  11.  public void setCompanyDao(CompanyDao companyDao) {      
  12.   this.companyDao = companyDao;      
  13.  }      
  14.  public void insertCompany(Company c){      
  15.   //some security check      
  16.   companyDao.save(c);      
  17.   //some updates      
  18.  }      
  19.  public void deleteCompany(int id){      
  20.   //some security check      
  21.   companyDao.deleteById(id);      
  22.   // some updates      
  23.  }      
  24.  public void updateCompany(Company c){      
  25.   companyDao.save(c);      
  26.  }      
  27.  public List list(){      
  28.   return companyDao.list();      
  29.  }      
  30. }   

 

 

它调用dao组件执行crud.事务控制一般都放在这一层.

  1. <bean id="companyDao" class="dao.hibernate.CompanyDaoImpl">     
  2.  <property name="hibernateTemplate" ref="hibernateTemplate" />     
  3. </bean>     
  4. <!-- 需要被增强的bean通常命名为xxxxTarget -->     
  5. <bean id="companyServiceTarget" class="services.CompanyService">     
  6.  <property name="companyDao" ref="companyDao" />     
  7. </bean>     
  8. <!-- 事务管理器 -->     
  9. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">     
  10.  <property name="dataSource" ref="dataSource" />     
  11. </bean>     
  12. <!-- 被代理之后的service,它具有事务功能,程序中我们就使用它 -->     
  13. <bean id="companyService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">     
  14.  <!-- 事务管理器 -->     
  15.  <property name="transactionManager" ref="txManager" />     
  16.  <!-- 需要被代理的目标 -->     
  17.  <property name="target" ref="companyServiceTarget" />     
  18.  <!-- optimize可选,true代表使用CGLib, false代表使用jdk proxy -->     
  19.  <property name="optimize" value="true" />     
  20.  <!-- 事务属性, 顺序: PROPAGATION, ISOLATION, readOnly, -Exceptions, +Exceptions -->     
  21.  <property name="transactionAttributes">     
  22.   <props>     
  23.    <prop key="insert*">PROPAGATION_REQUIRED</prop>     
  24.    <prop key="update*">PROPAGATION_REQUIRED</prop>     
  25.    <prop key="delete*">PROPAGATION_REQUIRED</prop>     
  26.    <prop key="list">PROPAGATION_REQUIRED, readOnly</prop>     
  27.    <prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>     
  28.   </props>     
  29.  </property>     
  30. </bean>     
  31. <bean id="companyDao" class="dao.hibernate.CompanyDaoImpl">  
  32.  <property name="hibernateTemplate" ref="hibernateTemplate" />  
  33. </bean>  
  34. <!-- 需要被增强的bean通常命名为xxxxTarget -->  
  35. <bean id="companyServiceTarget" class="services.CompanyService">  
  36.  <property name="companyDao" ref="companyDao" />  
  37. </bean>  
  38. <!-- 事务管理器 -->  
  39. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  40.  <property name="dataSource" ref="dataSource" />  
  41. </bean>  
  42. <!-- 被代理之后的service,它具有事务功能,程序中我们就使用它 -->  
  43. <bean id="companyService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  44.  <!-- 事务管理器 -->  
  45.  <property name="transactionManager" ref="txManager" />  
  46.  <!-- 需要被代理的目标 -->  
  47.  <property name="target" ref="companyServiceTarget" />  
  48.  <!-- optimize可选,true代表使用CGLib, false代表使用jdk proxy -->  
  49.  <property name="optimize" value="true" />  
  50.  <!-- 事务属性, 顺序: PROPAGATION, ISOLATION, readOnly, -Exceptions, +Exceptions -->  
  51.  <property name="transactionAttributes">  
  52.   <props>  
  53.    <prop key="insert*">PROPAGATION_REQUIRED</prop>  
  54.    <prop key="update*">PROPAGATION_REQUIRED</prop>  
  55.    <prop key="delete*">PROPAGATION_REQUIRED</prop>  
  56.    <prop key="list">PROPAGATION_REQUIRED, readOnly</prop>  
  57.    <prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>  
  58.   </props>  
  59.  </property>  
  60. </bean>   


测试:

  1. public class Test {   
  2.  public static void main(String[] args) throws InterruptedException, SQLException{   
  3.   ApplicationContext c = new ClassPathXmlApplicationContext("spring-test.xml");   
  4.   CompanyService s = (CompanyService)c.getBean("companyService");   
  5.   List list = s.list();   
  6.   System.out.println(list.size());   
  7.   s.insertCompany(new Company("www.ddd.com","ddd","wuhan"new Date()));   
  8. }}   

 

通常情况下,service层需要的事务控制的配置大都相同,而且方法名大都是insertXXX, updateXXX, deleteXXX, searchXXX, checkXXX诸如此类,所以我们可以配置一个可复用的事务代理:
view plaincopy to clipboardprint?

  1. <!-- abstract="true"标明它是抽象的 -->     
  2. <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">     
  3.  <property name="transactionManager" ref="txManager" />     
  4.  <!-- target被注释掉 -->     
  5.  <!--property name="target" ref="companyServiceTarget" /-->     
  6.  <property name="transactionAttributes">       
  7.   <props>     
  8.    <prop key="insert*">PROPAGATION_REQUIRED</prop>     
  9.    <prop key="update*">PROPAGATION_REQUIRED</prop>     
  10.    <prop key="delete*">PROPAGATION_REQUIRED</prop>     
  11.    <prop key="list">PROPAGATION_REQUIRED, readOnly</prop>     
  12.    <prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>     
  13.   </props>     
  14.  </property>     
  15. </bean>     
  16. <bean id="companyService" parent="baseTransactionProxy">     
  17.  <property name="target" ref="companyServiceTarget" />     
  18. </bean>     
  19. <bean id="otherService" parent="baseTransactionProxy">     
  20.  <property name="target" ref="otherServiceTarget" />     
  21. </bean>     
  22. ......    

分享到:
评论

相关推荐

    spring事务与数据库操作

    ### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...

    Spring事务管理Demo

    在压缩包中的Spring事务管理练习,你可以尝试创建一个简单的示例,例如模拟两个银行账户转账的过程,通过开启事务确保转账的原子性,即转账操作要么全部成功,要么全部失败。这样可以帮助你更好地理解Spring事务管理...

    spring对多个数据库进行事务管理.doc

    Spring 框架确实提供了对多个数据库事务管理的支持,这对于多数据源的应用场景非常关键。在Spring中,事务管理可以通过编程式和声明式两种方式进行。编程式事务管理需要程序员手动控制事务的开始、提交、回滚等操作...

    Spring综合实例 spring配置oracel数据库 事务管理 切面

    Spring综合实例 spring配置oracel数据库 事务管理 切面 业务描述:实现用户简单的注册登录功能。 用户注册时候需要输入用户名,密码,邮箱地址,点击注册后成功。 用户登录时可以选择使用用户名或者邮箱地址进行...

    Spring事务管理开发必备jar包

    本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...

    Spring事务管理的jar包

    本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...

    spring 事务管理的理解

    综上所述,Spring的事务管理为开发者提供了强大且灵活的工具来处理数据库事务,无论是简单的应用还是复杂的分布式系统,都能游刃有余。理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在...

    Spring事务管理失效原因汇总

    总结来说,Spring事务管理失效的原因是多方面的,涵盖从代理模式原理到AOP的实现细节,再到异常处理机制,以及事务传播和隔离级别的配置等多个层面。开发者需要深入理解Spring框架的内部机制,才能在实际开发中有效...

    spring事务管理5种方法

    本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。

    实验 spring 声明事务

    实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...

    Spring事务流程图

    Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...

    Spring的事务管理小案例

    事务具有四个特性,通常被称为ACID(原子性、一致性、隔离性和持久性)。原子性确保事务中的所有操作要么全部成功,要么全部失败;一致性确保事务执行前后,数据的状态符合业务规则;隔离性防止多个事务并发执行时的...

    Spring Boot数据库事务控制.zip

    本资料主要围绕Spring Boot如何进行数据库事务管理进行深入探讨。 首先,我们需要了解什么是事务。事务是数据库操作的基本单位,它保证了一组数据库操作要么全部成功,要么全部失败,避免了数据不一致的情况。在...

    全面分析_Spring_的编程式事务管理及声明式事务管理

    要进行 Spring 事务管理的实践,你需要一个开发环境,包括 JDK、Spring 框架和数据库(如 MySQL)。你可以创建一个简单的 Spring 应用,配置事务管理器,并在业务层使用 @Transactional 注解或 TransactionTemplate ...

    spring_事务管理(实例代码)

    Spring事务管理就是围绕这些特性来确保数据的一致性。 四、事务的传播行为 在Spring中,我们可以配置事务的传播行为,比如REQUIRED(默认,如果当前存在事务,则加入当前事务,否则新建一个事务)、PROPAGATION_...

    Spring事务操作示例(四种方式)

    Spring事务操作示例(四种方式),包含完整代码和数据库文件(基于MySQL,在项目sql文件夹中),可运行,学习Spring事务详见博客:http://blog.csdn.net/daijin888888/article/details/51822257

    Spring事务传播原理及数据库事务操作原理.rar

    事务通常包含四个特性,即ACID(原子性、一致性、隔离性和持久性)。原子性保证事务中的所有操作要么全部成功,要么全部失败;一致性确保事务执行前后,数据库状态的正确性;隔离性防止多个事务同时操作同一数据导致...

Global site tag (gtag.js) - Google Analytics