Spring5 事务(五)

180 阅读2分钟

一、什么是事务

事务时数据库操作,逻辑的一组操作,如果有一个操作失败,则都失败。

事物的四个特性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

二、基础环境搭建

在数据库中添加表和两条记录

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。

事物的隔离级别:和MySQL中的事务隔离级别一样。

  • 脏读:读未提交的数据
  • 不可重复读:读已提交的事务
  • 幻读:读到提交的新增的数据

超时时间:事务需要在一定时间内提交,如果不提交则会滚,单位是s,默认为-1。

是否只读:是否只是查询,默认为false。

回滚:出现了哪些异常进行回滚

不回滚:出现了哪些异常不进行回滚