Spring总结—事务
Spring总结—事务事务操作(Spring事务管理介绍)事务添加到JavaEE三层结构里面service层(业务逻辑层)web层(业务) dao层在spring进行事务管理操作有两种方式 :编程式事务管理和声明式事务管理(使用)(一般不会使用编程式,会使代码臃肿)声明式事务管理基于注解方式(使用)基于xml配置文件方式在spring 进行声明式事务管理,底层使用AOPspring事务管理API提
·
Spring总结—事务
(1)创建数据库表,添加记录
(2)创建service,搭建dao,完成对象创建和注入关系
service注入dao,在dao中注入JDBCTemplate,JDBCtemplate中注入DataSource
(3)转账实现
多钱与少钱的方法
@Override
public void addMoney() {
String sql="update t_account set money=money+? where username=?";
int marry = jdbcTemplate.update(sql, 100, "mary");
System.out.println(marry);
}
@Override
public void reduceMoney() {
String sql="update t_account set money=money-? where username=?";
int lucy = jdbcTemplate.update(sql, 100, "lucy");
System.out.println(lucy);
}
转账的方法(二者都实现,事务—都实现)
@Autowired
private UserDao userDao;
public void setMoney(){
userDao.reduceMoney();
userDao.addMoney();
}
(4)上面代码,如果正常执行没有问题,但是如果执行过程中出现异常,则会出现问题。
执行后,不会执行加钱的方法
上面的问题怎么解决呢?
使用事务进行解决(要么都成功,要么都失败)
事务操作(Spring事务管理介绍)
- 事务添加到JavaEE三层结构里面
service层(业务逻辑层)web层(业务) dao层 - 在spring进行事务管理操作
有两种方式 :编程式事务管理和声明式事务管理(使用) (一般不会使用编程式,会使代码臃肿) - 声明式事务管理
基于注解方式(使用)
基于xml配置文件方式 - 在spring 进行声明式事务管理,底层使用AOP
- spring事务管理API
提供了一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类,PlatformTransactionManager接口中有各种实现类
事务操作 (注解声明式事务管理)
(1)在Spring配置文件中配置事务管理器
(2)在spring 配置文件中开启事务注解
在spring配置文件中引入名称空间tx
开启事务注解
(3)在service类上面添加事务注解
@Transactional,这个注解添加到类上面,也可以添加到方法上面
如果把这个注解添加类上面,这个类里面所有的方法都添加了事务
如果把这个注解添加到方法上面,则只有这个方法添加了事务 - 事务操作(声明式事务管理参数配置)
(1)在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
<1>Propagation 事务传播行为
多事务方法之间直接进行调用,在这个过程中事务是如何进行管理的
<2> Isolation :事务隔离级别
事务有个特性称为隔离性,多事务操作之间不会产生影响,不考虑隔离性会产生很多问题。
有三个对问题:脏读、不可重复读、虚(幻)读
脏读:一个未提交事务读取到另一个未提交事务的数据
不可重复读:一个未提交事务读取到另一个已提交事务的数据
虚读:一个未提交事务读到另一个提交事务添加的数据
通过设置事务隔离级别,解决读问题
<3>timeout:超时时间
事务在一定的时间内进行提交,如果不提交进行回滚
默认值是-1 ,设置时间以秒为单位进行计算
<4> readOnly :是否只读
读:查询操作
写:添加修改删除操作
readOnly默认值是false。表示可以查询,可以添加修改删除操作
设置readonly的值是TRUE,设置成TRUE后,只能查询。
<5>rollbackfor :回滚 设置出现哪些异常进行事务回滚
<6>norollbackfor :不回滚 设置出现哪些异常不进行回滚
- 事务操作(xml声明式事务管理)
(1)第一步配置事务管理器
(2)第二步配置通知
(3)第三步配置切入点和切面
<!-- 配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第二步配置通知 通知:要加强的内容,这里要加强的内容是添加事务到指定方法-->
<tx:advice id="txadvice">
<!-- 配置事务参数-->
<tx:attributes>
<!-- 指定在那种方法上添加事务-->
<tx:method name="setMoney" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 第三步配置切入点和切面 -->
<aop:config>
<!-- 配置切入点 切入点:被加强的方法-->
<aop:pointcut id="point" expression="execution(* com.sun.Spring.Dao.Service.UserService.*(..))"/>
<!-- 配置切面 切面:将要加强的内容作用到被加强的方法中的过程-->
<aop:advisor advice-ref="txadvice" pointcut-ref="point"/>
</aop:config>
- 事务操作(完全注解开发)
创建配置类,使用配置类类替代xml文件
配置类
package com.sun.Spring.Dao.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration //配置类
//组件扫描
@ComponentScan(basePackages ="com.sun.Spring.Dao")
//开启事务
@EnableTransactionManagement
public class TxConfig {
// 创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///java");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource; //返回值是DruidDataSource类型的
}
// 创建JDBCTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
// 到ioc容器中根据类型找到dataSource对象进行注入
JdbcTemplate jdbcTemplate=new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// 配置事务管理器
@Bean
public DataSourceTransactionManager getdataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager TransactionManager=new DataSourceTransactionManager();
TransactionManager.setDataSource(dataSource);
return TransactionManager;
}
}
更多推荐
所有评论(0)