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,
-
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事务与数据库操作
Spring综合实例 spring配置oracel数据库 事务管理 切面 业务描述:实现用户简单的注册登录功能。 用户注册时候需要输入用户名,密码,邮箱地址,点击注册后成功。 用户登录时可以选择使用用户名或者邮箱地址进行...
spring对多个数据库进行事务管理,配置分布式事务
HibernateSHibernateSpring数据库的事务HibernateSpring数据库的事务HibernateSpring数据库的事务pring数据库的事务
Spring事务操作示例(四种方式),包含完整代码和数据库文件(基于MySQL,在项目sql文件夹中),可运行,学习Spring事务详见博客:http://blog.csdn.net/daijin888888/article/details/51822257
本代码使用H2内存数据库演示spring事务使用,包括编程式事务,声明式事务@Transactional使用,自定义事务事务注解实现自定义事务管理器
4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。 二.实验内容 (1)使用Spring JDBC实现书店的购书过程,即有如下一个BookShopDao接口,编写BookShopDaoImp类实现该接口中的...
5.1 Spring事务管理概述 在实际开发中,操作数据库时都会涉及到事务管理问题,为此Spring提供了专门用于事务处理的API。Spring的事务管理简化了传统的事务管理流程,并且在一定程度上减少了开发者的工作量。 5.1.1 ...
此包含有所有Spring事务管理开发所需要的Jar包,包含框架、核心、表达式、日志、编译、事务切面aop、数据库连接、单元测试、框架文本等jar包。
Spring Boot数据库事务控制.zip
Spring事务传播原理及数据库事务操作原理.rar
全面分析_Spring_的编程式事务管理及声明式事务管理,本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解。您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等。本文将直接使用...
很好的spring+ibatis事务的配置文档.
跟我学Spring3(9.1)Spring的事务之数据库事务概述Java开发Java经验技巧共3页.pdf.zip
4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。 二、 实验内容 1、在MySQL中创建以下三张表,其中account为账户表,book为书籍信息表,book_stock为书籍库存表。 (1)使用...
事务的属性:1.Propagation:用来设置事务的传播行为事务的传播行为:一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启了一个新
测试spring事务管理 搭建了ssh框架的web工程 本工程用到的数据库表很简单 user(id, name) 可自行创建 本例所有的事务放在service层进行管理,方法中间抛出运行时异常以测试是否回滚 Spring配置文件中关于事务...
spring事务管理,一些简单事务的控制,用idea环境搭建,数据库需要自己修改
上面我们只是简单的使用事务,这里将讨论Spring事务机制中最重要的两个配置项,即隔离级别与传播行为。毫无疑问本节内容是本章的核心内容,也是互联网企业最关注的内容之一,因此他十分重要,值得花费大的篇幅去讨论...
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo