数据库事务的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,
-
package services;
-
import java.util.List;
-
import model.Company;
-
import dao.hibernate.CompanyDao;
-
-
public class CompanyService {
-
private CompanyDao companyDao;
-
public CompanyDao getCompanyDao() {
-
return companyDao;
-
}
-
public void setCompanyDao(CompanyDao companyDao) {
-
this.companyDao = companyDao;
-
}
-
public void insertCompany(Company c){
-
-
companyDao.save(c);
-
-
}
-
public void deleteCompany(int id){
-
-
companyDao.deleteById(id);
-
-
}
-
public void updateCompany(Company c){
-
companyDao.save(c);
-
}
-
public List list(){
-
return companyDao.list();
-
}
-
}
它调用dao组件执行crud.事务控制一般都放在这一层.
-
<bean id="companyDao" class="dao.hibernate.CompanyDaoImpl">
-
<property name="hibernateTemplate" ref="hibernateTemplate" />
-
</bean>
-
-
<bean id="companyServiceTarget" class="services.CompanyService">
-
<property name="companyDao" ref="companyDao" />
-
</bean>
-
-
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
-
<property name="dataSource" ref="dataSource" />
-
</bean>
-
-
<bean id="companyService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
-
-
<property name="transactionManager" ref="txManager" />
-
-
<property name="target" ref="companyServiceTarget" />
-
-
<property name="optimize" value="true" />
-
-
<property name="transactionAttributes">
-
<props>
-
<prop key="insert*">PROPAGATION_REQUIRED</prop>
-
<prop key="update*">PROPAGATION_REQUIRED</prop>
-
<prop key="delete*">PROPAGATION_REQUIRED</prop>
-
<prop key="list">PROPAGATION_REQUIRED, readOnly</prop>
-
<prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>
-
</props>
-
</property>
-
</bean>
-
<bean id="companyDao" class="dao.hibernate.CompanyDaoImpl">
-
<property name="hibernateTemplate" ref="hibernateTemplate" />
-
</bean>
-
-
<bean id="companyServiceTarget" class="services.CompanyService">
-
<property name="companyDao" ref="companyDao" />
-
</bean>
-
-
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
-
<property name="dataSource" ref="dataSource" />
-
</bean>
-
-
<bean id="companyService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
-
-
<property name="transactionManager" ref="txManager" />
-
-
<property name="target" ref="companyServiceTarget" />
-
-
<property name="optimize" value="true" />
-
-
<property name="transactionAttributes">
-
<props>
-
<prop key="insert*">PROPAGATION_REQUIRED</prop>
-
<prop key="update*">PROPAGATION_REQUIRED</prop>
-
<prop key="delete*">PROPAGATION_REQUIRED</prop>
-
<prop key="list">PROPAGATION_REQUIRED, readOnly</prop>
-
<prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>
-
</props>
-
</property>
-
</bean>
测试:
-
public class Test {
-
public static void main(String[] args) throws InterruptedException, SQLException{
-
ApplicationContext c = new ClassPathXmlApplicationContext("spring-test.xml");
-
CompanyService s = (CompanyService)c.getBean("companyService");
-
List list = s.list();
-
System.out.println(list.size());
-
s.insertCompany(new Company("www.ddd.com","ddd","wuhan", new Date()));
-
}}
通常情况下,service层需要的事务控制的配置大都相同,而且方法名大都是insertXXX, updateXXX, deleteXXX, searchXXX, checkXXX诸如此类,所以我们可以配置一个可复用的事务代理:
view plaincopy to clipboardprint?
-
-
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
-
<property name="transactionManager" ref="txManager" />
-
-
-
<property name="transactionAttributes">
-
<props>
-
<prop key="insert*">PROPAGATION_REQUIRED</prop>
-
<prop key="update*">PROPAGATION_REQUIRED</prop>
-
<prop key="delete*">PROPAGATION_REQUIRED</prop>
-
<prop key="list">PROPAGATION_REQUIRED, readOnly</prop>
-
<prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>
-
</props>
-
</property>
-
</bean>
-
<bean id="companyService" parent="baseTransactionProxy">
-
<property name="target" ref="companyServiceTarget" />
-
</bean>
-
<bean id="otherService" parent="baseTransactionProxy">
-
<property name="target" ref="otherServiceTarget" />
-
</bean>
-
......
分享到:
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
Spring事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型
Synchronized锁在Spring事务管理下,导致线程不安全。
本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...
本文将详细介绍Spring事务管理的四种方式:编程式事务管理、声明式事务管理、PlatformTransactionManager接口以及TransactionTemplate。 1. **编程式事务管理**:这是一种手动控制事务的方式,通过在代码中调用`...
### Spring事务管理详解 #### 一、Spring事务管理的重要性及必要性 在现代软件开发中,事务管理是一项至关重要的技术,特别是在涉及数据库操作时。事务能够确保一系列操作要么全部成功,要么全部失败,这对于保持...
Spring事务管理是Spring框架的核心特性之一,它提供了一种强大且灵活的方式来管理应用程序中的事务边界。在企业级Java应用中,事务处理是确保数据一致性、完整性和可靠性的关键部分。本篇文章将深入探讨Spring的事务...
总的来说,Spring事务管理提供了一种灵活、强大的方式来处理应用程序中的事务,无论是在简单还是复杂的事务场景下,都能有效保证数据的一致性和完整性。通过声明式事务管理,开发者可以将关注点从事务细节中解脱出来...
Spring事务管理是Spring框架的核心特性之一,它提供了一种在Java应用中管理和协调数据库事务的标准方式。对于有Java基础的开发者来说,理解并掌握Spring事务管理至关重要,因为这有助于确保数据的一致性和完整性,...
当出现像描述中那样的问题——SQL语句执行出错但事务未回滚时,我们需要深入理解Spring事务管理的配置和机制。以下是一些关键知识点: 1. **Spring事务管理类型**: - **编程式事务管理**:通过`...
spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...
在思维导图"Spring Transaction.twd"中,可能包含了Spring事务管理的各个概念和它们之间的关系,如事务的ACID属性(原子性、一致性、隔离性和持久性),事务管理器,以及声明式和编程式事务管理的实现方式。...
### Spring事务管理的方法 #### 一、引言 在企业级应用开发中,事务管理是一项至关重要的技术。Spring框架作为Java领域中一个非常流行的轻量级框架,为开发者提供了多种方式来实现事务管理,其中主要分为编程式...
Spring事务管理确保每个事务都是独立的,防止了脏读、不可重复读和幻读等问题。脏读是指事务T1读取了事务T2未提交的修改;不可重复读是指事务T1在不同时间读取同一数据时得到不同结果,因为T2在这期间做了修改;幻读...