一、什么是事务
事务时数据库操作,逻辑的一组操作,如果有一个操作失败,则都失败。
事物的四个特性
- 原子性
- 一致性
- 隔离性
- 持久性
二、基础环境搭建
在数据库中添加表和两条记录
create table account(
id varchar(32) primary key,
name varchar(32),
money int
);
insert into account values('1','zhangsan',500),('2','lisi','500');
创建对应的实体类,service,dao类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class account {
private String id;
private String name;
private int money;
}
@Service
public class AccountService {
@Autowired
private AccountDao accountDao;
//李四向张三转账
public void transfer(){
//多100
accountDao.addMoney();
//少100
accountDao.subMoney();
}
}
@Repository
public class AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
//张三增加100
public void addMoney(){
String sql="UPDATE ACCOUNT SET MONEY = ? WHERE NAME = ?";
jdbcTemplate.update(sql,600,"zhangsan");
}
//李四减少100
public void subMoney(){
String sql="UPDATE ACCOUNT SET MONEY = ? WHERE NAME = ?";
jdbcTemplate.update(sql,400,"lisi");
}
}
如果service中的方法改成如下
public void transfer(){
//多100
accountDao.addMoney();
int a = 1/0;
//少100
accountDao.subMoney();
}
会导致张三的钱多了 但是李四钱没减。
三、Spring的事务管理
3.1 spring事务说明
1.事务添加到service层
2.Spring中进行事务管理操作
- 编程式事务管理(几乎不用)
- 声明式事务管理(常用)
声明式事务又分为注解事务和xml事务
3.2 注解式事务
先在配置文件中名称空间中加入这两个内容
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
然后配置事务管理器和开启自动扫描
<!-- 开始事务管理器 -->
<tx:advice transaction-manager="dataSourceTransactionManager"></tx:advice>
<!--开启注自动扫描-->
<context:component-scan base-package="com.bin.spring5"></context:component-scan>
然后再servicel类中的方法上加注解即可,也可以在类上加,表示该类中所有方法都开启事务
@Transactional
public void transfer(){
//多100
accountDao.addMoney();
int a =1/0;
//少100
accountDao.subMoney();
}
3.3 声明式事务的参数
- propagation 事务的传播行为
- ioslation 事物的隔离级别
- timeout 超时时间
- readOnly 是否只读
- rollbackFor 回滚
- noRollbackFor 不回滚
事务的传播行为:指方法中嵌套方法时,事务是怎么处理的。常用的有REQUERDHE, REQUERD_NEW。
- 脏读:读未提交的数据
- 不可重复读:读已提交的事务
- 幻读:读到提交的新增的数据
超时时间:事务需要在一定时间内提交,如果不提交则会滚,单位是s,默认为-1。
是否只读:是否只是查询,默认为false。
回滚:出现了哪些异常进行回滚
不回滚:出现了哪些异常不进行回滚