两个service事务统一_数据库操作工具JdbcTemplate与Spring的声明式事务控制

本文介绍了事务的ACID特性,包括原子性、一致性、隔离性和持久性,并探讨了事务并发问题如脏读、幻读和不可重复读。接着讲解了不同事务隔离级别的作用,以及Spring声明式事务配置的XML方式。最后提到了事务传播行为在Service层调用中的处理。
摘要由CSDN通过智能技术生成
点击上方“ IT咸鱼 ”,星标公众号 a470e215e82ceb00134e56302550fbd8.gif 嘀嘀作者说想要的 每天分享技术栈,开发工具等 JdbcTemplate数据库操作工具使用 JdbcTempalte是Spring框架提供给我们的一个数据库操作工具,使用和Dbutils非常之相似
DbutilsJdbcTemplate
操作的是核心对象QueryRunner操作的是核心对象JdbcTemplate
调用update接口(增、删、改)调用update接口(增、删、改)
调用query接口(查询)调用queryForObject(查询单个值/单个对象)
      调用query接口(查询集合)
Dbutils封装单个对象使用BeanHandler<>(),封装集合使用BeanListHandler<>();它们的接口是ResutsetHandler( 工具提供接口,也提供实现类 ) JdbcTemplate在封装查询结果集数据时,只给我们提供了接口RowMapper,没有提供实现类,需要我们自己写实现
<dependency>    <groupId>org.springframeworkgroupId>    <artifactId>spring-jdbcartifactId>    <version>5.0.2.RELEASEversion>dependency><dependency>    <groupId>org.springframeworkgroupId>    <artifactId>spring-txartifactId>    <version>5.0.2.RELEASEversion>dependency>
JdbcTemplate开发Dao层的两种方式 需求:开发service层和dao层,service层调用dao层,在dao层中使用JdbcTemplate实现Account表的Crud(半xml半注解形式实现) 方式一:定义JdbcTemplate为普通Bean(和Dbutils一样)applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>       xmlns:context="http://www.springframework.org/schema/context"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       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">                                                                                    

AccountDaoImpl.java efc049a375c58753f0f5894edab75bdc.png 方式二:继承JdbcDaoSupport类 注意:相比于方式一,不需要引入额外的jar   玩法二和玩法一的区别在于:dao层实现类中jdbcTemplate对象的获取方式 玩法二中 Dao 层实现类直接继承 JdbcDaoSupport 父类,从父类中获取 JdbcTemplate 对象   注意: 推荐使用方式一 ,继承JdbcDaoSupport类的方式只支持Dao层实现类使用xml配置定义为对象,不支持使用注解的方式将Dao层实现类定义为对象 如下:必须在xml中定义dao实现类对象 b11c6995fb2d065dc76efbe0a440f3a3.png dao实现类中继承JdbcDaoSupport父类 0b97591a66c515b2447f77776561ba4b.png Spring内置数据源 be5e74103e69529887166ea93b11a4ee.png Spring的声明式事务控制 编程式事务:事务控制代码添加在业务逻辑代码中,这种方式叫做编程式事务 声明式事务:就是通过xml配置或者注解即可完成事务控制的方式/机制,叫做声明式事务

关于事务

l 事务基本特性(ACID,是针对单个事务的一个完美状态)

n 原子性:指的是在一个事务内的操作,要么都成功,要么都失败,案例比如转账,要么汇款和收款都成功,要么都失败。

n 一致性:一致性和原子性描述的是同一件事情,只是角度不一样。原子性从一个事务内的操作角度来说的,要成功都成功要失败都失败;一致性是从数据的角度来说的,比如转账A,B账户初始状态(1000,1000),A转账B100块,那么对于事务外部来说,能够看到的数据状态要么是(1000,1000),要么是(900,1100),不能够出现(900,1000)或者(1000,1100)这种异常/中间数据状态

n 隔离性:比如给员工涨工资2000元,但是事务还有提交,员工就查询到已经涨了2000元(脏读),需要隔离性处理(后面隔离级别模块说明)

n 持久性:事务一旦提交即生效,即使数据库服务器宕机重启,重启后数据也应该是事务提交之后的状态,不应该是未提交时的状态

l 事务并发问题

n 脏读

u 场景

1、 财务人员状态不好,误发起事务1,给员工A涨了1w工资,但是尚未提交事务

2、 员工A此时发起了事务2,查询当月工资,发现涨了1w,好happy

3、 财务人员发现搞错了,赶紧撤销操作(回滚事务1)

整个过程中,员工A的事务2读取到了财务人员事务1中未提交的数据,这叫脏读

n 幻读(针对的insert和delete)

u 场景

1、 发现事务1,查询工资表中工资为1w的员工的总数,查询出来了10个人,此时事务1不关闭

2、 2名新员工入职,工资也都是1w,财务人员发起事务2向工资表中插入了两条工资为1w的记录,并且提交事务

3、事务1再次查询工资表中工资为1w的员工的总数,查询出来了12个人,不是10个人吗?见鬼了

n 不可重复读(针对的update)

u 场景

1、 员工A发起了事务1查询当月工资为1w,此时事务1也不关闭

2、 财务人员发起事务2给员工A涨了2000元工资,并且提交事务

 3、事务1再次查询当月工资,发现工资为1.2w。原来的1w那条数据读不到了(不可重复读)

l 事务隔离级别(解决是事务并发问题的)

n 读未提交(极端情况):Read Uncommitted,什么问题也解决不了,效率最高,风险最大,不要使用这种隔离机制

n 读已提交:Read Committed,可以解决脏读问题,不能解决幻读和不可重复读问题(因为已经提交事务了)

n 可重复读:Read Repeatable:可以解决脏读和不可重复读问题,解决不了幻读问题

n 串行化(极端情况):Serializable,可以解决脏读、幻读和不可重复读,最安全但是效率最差

n 默认,default,数据库都有自己的默认隔离机制,mysql默认可重复读,oracle默认读已提交

l 事务传播行为

事务往往添加在service层方法上,比如service层A方法调用了service层B方法,那么A和B本身都有事务控制,那么在调用的时候需要进行一些协商(关于事务),这种事务协商机制就叫做事务的传播行为。

A调用B,在研究事务的传播行为的时候,我们要站在B的角度来认识

Spring声明式事务配置

pom.xml
<dependency>    <groupId>org.springframeworkgroupId>    <artifactId>spring-jdbcartifactId>  <version>5.0.2.RELEASEversion>dependency><dependency>    <groupId>org.springframeworkgroupId>    <artifactId>spring-txartifactId>    <version>5.0.2.RELEASEversion>dependency><dependency>    <groupId>org.springframeworkgroupId>    <artifactId>spring-aopartifactId>    <version>5.0.2.RELEASEversion>dependency><dependency>    <groupId>org.aspectjgroupId>    <artifactId>aspectjweaverartifactId>    <version>1.8.9version>dependency>

基于XML

Spring包容性很强 Spring可以支持很多的dao层数据库操作技术,对于不同的技术体系,事务操作的方式不太一样 jdbc:connection.commit();connection.rollback() jdbcTempalte Mybatis:sqlSession.commit() Hibernate:session.commit(); Spring为了统一管理,定义接口(开启事务、提交事务、回滚事务等),不同的技术体系可以进行不同的实现。 当然,实现类不需要我们自己完成,Spring已经给我们提供了 49e34731d71df81761210119c7fd7b1b.gif

(代码每步加注释)整合Spring和SpringMVC

2020-11-18

c3d944a199f17288284975d137c82b51.png

Spring框架的江湖地位以及入门案列(附代码注释)

2020-11-19

355e45234e9b6d93dca3def8303162ef.png

SpringIOC的注解! Spring注解和XML的选择问题

2020-11-20

190130b93561b4ac9931ea6127854972.png

动态代理回顾和SpringAOP横向抽取思想

2020-11-22

98ed9f6e001bd7bd2ebb7da41bdbebe3.png
END
如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。
我知道你 “在看
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值