事务概念
1、什么是事务
(1)事务是数据库操作最基本单元。逻辑上一组操作,要么都成功,要么失败
(2)典型场景:银行转账
*A转100元给B
*A少100,B多100
2、事务四个特性(ACID)
原子性 一致性 隔离性 持久性
3、事务操作基本过程(一般把事务加到service层)
package com.spring.service;
import com.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 注入dao
@Autowired
private UserDao userDao;
//转账的操作
public void accountMoney(){
try {
// 第一步 开启事务
// 第二步 进行业务操作
// a少100
userDao.reduceMoney();
// 模拟异常
int i = 10/0;
// b多100
userDao.addMoney();
// 第三步 没有异常,提交事务
}catch (Exception e){
// 第四步 出现异常 事务回滚
}
}
}
Spring事务管理
1、事务添加到Service层
2、Spring进行事务管理两种操作方式
编程式 声明式(常用)
3、声明式:
(1)基于注解
(2)基于XML方式
4、在spring进行声明式事务管理,底层使用AOP原理
5、Spring进行事务管理的API
(1)提供一个接口,针对不同框架提供不同实现类
事务操作(基于注解声明式)
1、在spring配置文件创建事务管理器
2、在spring配置文件 开启事务注解
(1)spring配置文件中引入名称空间tx
(2)开启事务注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 开启组件扫描-->
<context:component-scan base-package="com.spring"></context:component-scan>
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="jdbc:mysql:///user_db" />
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
</bean>
<!-- 配置JdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>
3、在Service类上(或service类中方法上)添加事务注解
package com.spring.service;
import com.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional //可以添加到类上(类中所有方法都添加事务注解),也可以添加到方法上
public class UserService {
// 注入dao
@Autowired
private UserDao userDao;
//转账的操作
public void accountMoney(){
userDao.reduceMoney();
// 模拟异常
int i =10/0;
userDao.addMoney();
}
}
事务操作(声明式事务管理参数配置)
1、在service类上添加注解@Transactional,在这个注解中可以配置事务相关参数
(1)propagation:事务传播行为(多事务方法直接调用,)
事务方法:对数据库表数据进行变化的操作
(2)isolation:事务隔离级别
多事务操作之间不会产生影响。
三个读问题:脏读、不可重复读、虚(幻)读
****脏读:一个未提交事务读取到另一个未提交事务的数据
****不可重复读:一个未提交事务读取到另一提交事务修改数据
****虚(幻)读:一个未提交事务读取到另一个提交事务添加数据
(3)timeout:超时时间
事务需要在一定时间内进行提交,超时回滚
默认值是-1,设置时间以秒为单位
(4)readOnly:是否只读(默认值为false)
(5)rollbackFor:回滚
(6)norollbackFor:不回滚
设置出现哪些异常进行事务回滚或者不进行事务回滚
@Transactional(propagation = Propagation.REQUIRED , isolation = Isolation.REPEATABLE_READ , timeout = -1, readOnly = false)