第⼆⼗九章 新版SSM整合-打通Mysql数据库控制事务(包含⾯试题)

1 Spring 常⻅的事务管理-⾯试常考点

简介:讲解Spring常⻅的事务管理 

  • 事务:多个操作,要么同时成功,要么失败后⼀起回滚 
    • 具备 ACID 四种特性
      • Atomic (原⼦性)
        Consistency (⼀致性)
        Isolation (隔离性)
        Durability (持久性)
  • 你知道常⻅的Spring事务管理⽅式吗 
  • 编程式事务管理 :
* 代码中调⽤ beginTransaction() commit() rollback() 等事务管理相关的⽅法,通过
TransactionTempalte ⼿动管理事务 ( ⽤的少 )

声明式事务管理:

* 通过AOP实现,可配置⽂件⽅式或者注解⽅式实现事务的管理控制(⽤的多)

  • 你知道声明式事务管理本质吗: 
                本质是对⽅法前后进⾏拦截,底层是建⽴在 AOP 的基础之上
                在⽬标⽅法开始之前创建或者加⼊⼀个事务,在执⾏完⽬标⽅法之后根据执⾏情况提交                  或者回滚事务

2 Spring事务的传播属性和隔离级别

简介:讲解 Spring 事务的传播属性和隔离级别
  • 事物传播⾏为介绍:
    • 如果在开始当前事务之前,⼀个事务上下⽂已经存在,此时有若⼲选项可以指定⼀个事务性⽅法的执⾏⾏为
      • @Transactional(propagation=Propagation.REQUIRED) 如果有事务 , 那么加⼊事务 , 没有的话新建⼀个( 默认情况下 )
        @Transactional(propagation=Propagation.NOT_SUPPORTED) 不为这个⽅法开启事务
        @Transactional(propagation=Propagation.REQUIRES_NEW) 不管是否存在事务 , 都创建⼀个新的事务, 原来的挂起 , 新的执⾏完毕 , 继续执⾏⽼的事务
        @Transactional(propagation=Propagation.MANDATORY) 必须在⼀个已有的事务中执⾏, 否则抛出异常
        @Transactional(propagation=Propagation.NEVER) 必须在⼀个没有的事务中执⾏ , 否则抛出异常( Propagation.MANDATORY 相反 )
        @Transactional(propagation=Propagation.SUPPORTS) 如果其他 bean 调⽤这个⽅法 ,在其他bean 中声明事务 , 那就⽤事务 . 如果其他 bean 没有声明事务 , 那就不⽤事务 .
        @Transactional(propagation=Propagation.NESTED) 如果当前存在事务,则创建⼀个 事务作为当前事务的嵌套事务来运⾏; 如果当前没有事务,则该取值等价于
        Propagation.REQUIRED

  • 事务隔离级别: 是指若⼲个并发的事务之间的隔离程度 
    • @Transactional(isolation = Isolation.READ_UNCOMMITTED) 读取未提交数据 ( 会出现脏读 , 不可重复读) 基本不使⽤
    • @Transactional(isolation = Isolation.READ_COMMITTED) 读取已提交数据 ( 会出现不可重复读和幻读)
      @Transactional(isolation = Isolation.REPEATABLE_READ) 可重复读 ( 会出现幻读 )
      @Transactional(isolation = Isolation.SERIALIZABLE) 串⾏化

MYSQL: 默认为REPEATABLE_READ级别 

3集 新版SpringBoot-Spring-Mybatsi事务控制讲解 

简介:新版SSM @Transactional 事务控制讲解 

快速创建SpringBoot+Spring+Mybatsi项⽬ 

        https://start.spring.io/

连接打通数据库
#配置数据源
spring.datasource.driver-class-name =com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis?
useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
#使⽤阿⾥巴巴druid数据源,默认使⽤⾃带的
#spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
#开启控制台打印sql
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

Maven插件
 

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!--引入JDBC-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.19</version>
		</dependency>

		<!--导入mybatis依赖包-->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.4</version>
		</dependency>

	</dependencies>

 控制层:

@RestController
@RequestMapping("api/v1/pri/videoOrder")
public class VideoOrderController {
    @Autowired
    private VideoOrderService videoOrderService;
    //下单操作
    @RequestMapping("save")
    public JsonData Save(){
        VideoOrder videoOrder = new VideoOrder();
        videoOrder.setUserId(6);
        videoOrder.setVideoId(6);

        videoOrder.setVideoTitle("小牛找工作");
        int save = videoOrderService.save(videoOrder);
       JsonData jsonData=  save == 1 ? JsonData.JsonDataBuild("插入成功") : JsonData.JsonDataError("",-100,"插入失败");
        return jsonData;
    }
}

服务层:在业务中插入事务

public interface VideoOrderService {


    int save(VideoOrder videoOrder);
}
@Service
@Transactional(propagation= Propagation.REQUIRED) //开启事务
public class VideoOrderServiceImpl implements VideoOrderService {
    @Autowired
    private VideoOrderMapper videoOrderMapper;
    @Override

    public int save(VideoOrder videoOrder) {
//        int i = 1/ 0;
        return videoOrderMapper.save(videoOrder);

    }
}

Mapper:

@Repository

public interface VideoOrderMapper {
    /**
     * 关联查询
     */
    List<VideoOrder> findVideoOrderList();
    //下单操作
    @Insert("insert into video_order(video_id,user_id,video_title) values(#{VideoId},#{userId},#{videoTitle})")
    int save(VideoOrder videoOrder);


}

启动类:

@SpringBootApplication
@MapperScan("com.example.ssmdemo.Mapper")
@EnableTransactionManagement //开启事务注解
public class SsmdemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(SsmdemoApplication.class, args);
	}

}

运行结果:

 4集 新版SpringBoot-Spring-Mybatsi课程总结和后续内容预告

简介:新版 SSM 课程总结和后续内容预告
新版 SSM 课程总结:
        SpringBoot
        Mybatis
        Spring

综合项⽬实战规划

后端 SpringBoot + Spring5 + Mybatis + Maven +IDEA +MySql + JWT + Guava + Jmeter5.X
前端 Vue + Vuex + Axios + CubeUI
阿⾥云 ECS CentOS7 + Nginx + 域名绑定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值