Spring 事务与事务操作

1、什么事务
(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败

2、事务四个特性(ACID)
(1)原子性 :事务的操作不可分隔,要么都执行,要么都不执行
(2)一致性 :数据从一种一致性单位变成另一种一致性单位 如两个人银行转账 每人各1000 a转给b100元 两个人的总数还是2000元
(3)隔离性 :一个事务的执行不能被另一个事务干扰
(4)持久性 :事务一旦提交,则对数据的修改是持久性的

3、事务的操作(完全注解开发案例)

1、事务添加到JavaEE三层结构里面Service层(业务逻辑层)
2、在Spring进行事务管理操作
(1)有两种方式:编程式事务管理和声明式事务管理(使用)
3、声明式事务管理
(1)基于注解方式(使用)
(2)基于xml配置文件方式
4、在Spring进行声明式事务管理,底层使用AOP原理
5、Spring事务管理API
(1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类

接口PlatformTransactionManager 实现类DataSourceTransactionManager

(2)在service类上面(或者service类里面方法上面)添加事务注解
①@Transactional,这个注解添加到类上面,也可以添加方法上面
②如果把这个注解添加类上面,这个类里面所有的方法都添加事务
③如果把这个注解添加方法上面,为这个方法添加事务

@Service
@Transactional
public class UserService {}

事务操作(声明式事务管理参数配置)
1、在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数

(1、propagation 2、isolation 3、timeout 4、readOnly 5、rollbackFor 6、noRollbackFor)

2、propagation:事务传播行为
(1)多事务方法直接进行调用,这个过程中事务 是如何进行管理的

Spring 事务与事务操作

3、ioslation:事务隔离级别

(1)事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题
(2)有三个读问题:脏读、不可重复读、虚(幻)读
(3)脏读:一个未提交事务读取到另一个未提交事务的数据

(4)不可重复读:一个未提交事务读取到另一提交事务修改数据

(5)虚读:一个未提交事务读取到另一提交事务添加数据
(6)解决:通过设置事务隔离级别,解决读问题

undefined

4、timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是 -1 ,设置时间以秒单位进行计算
5、readOnly:是否只读
(1)读:查询操作,写:添加修改删除操作
(2)readOnly默认值false,表示可以查询,可以添加修改删除操作
(3)设置readOnly值是true,设置成true之后,只能查询
6、rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚
7、noRollbackFor:不回滚
(1)设置出现哪些异常不进行事务回滚

undefined

undefined

//创建接口
public interface UserDao {
    void reduceMoney();
    void addMoney();
}
//接口实现类
@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void reduceMoney() {
        String sql = "update bank_money set money=money-? where username=?";

        jdbcTemplate.update(sql,100,"luxi");
    }

    @Override
    public void addMoney() {
        String sql = "update bank_money set money=money+? where username=?";

        jdbcTemplate.update(sql,100,"amy");
    }
}
//
@Service
@Transactional
public class UserService {
    @Autowired
    private UserDao userDao;

    public void accountMoney(){
        userDao.reduceMoney();
//        int i = 10/0;
        userDao.addMoney();
    }
}
//创建配置类
@Configuration//声明配置类
@ComponentScan(basePackages = "com.lianyou") //组件扫描
@EnableTransactionManagement //开启事务
public class txConfig {

    @Bean
    public DruidDataSource getDruidDataSoure(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///user_db");
        dataSource.setUsername("root");
        dataSource.setPassword("1234");

        return dataSource;
    }
    @Bean
    public JdbcTemplate getJdbcTemplate(DataSource dataSource){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }
    @Bean
    public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }}

测试

@Test
    public void testTransactional(){
        ApplicationContext contex = new AnnotationConfigApplicationContext(txConfig.class);
        UserService userService = contex.getBean("userService", UserService.class);
        userService.accountMoney();
    }

Original: https://www.cnblogs.com/wuzkkk/p/15921363.html
Author: 在厂的上进者
Title: Spring 事务与事务操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579684/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 我的友链朋友们

    Original: https://www.cnblogs.com/rayob1/p/16103182.htmlAuthor: Ray言午Title: 我的友链朋友们

    Java 2023年6月6日
    078
  • Redis Pipeline

    前言 今天在优化Feed流时发现服务重启后,初始化数据保存数据到Redis时异常慢,原来之前用的是单个set命令去做的,早就听闻Pipeline是redis批量操作的利器,正好这次…

    Java 2023年6月7日
    089
  • (java)数据接口与算法-时间复杂度和空间复杂度

    原文链接:https://blog.csdn.net/uftjtt/article/details/802454311. 基本概念数据结构到底是什么呢?我们先来谈谈什么叫数据。数据…

    Java 2023年6月9日
    079
  • SQL优化之Oracle函数索引

    SQL查询条件使用函数优化 背景: 由于数据原因表关联只能使用函数对数据进行分隔 select B.* from TABLE_A A cross join TABLE_B B wh…

    Java 2023年6月5日
    0108
  • java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.

    百度翻译就是:driverClassName需要jdbcUrl 在配置文件中的 改成: 就可以了。 spring.datasource.url 数据库的 JDBC URL。 spr…

    Java 2023年5月29日
    082
  • 基于TCP/IP协议,定义原始的字节流协议传输Student类

    在分布式系统中,不同节点之间需要进行通信来实现一致性,例如:在投票选举阶段,候选者需要为所有其他节点发送拉票请求,拉票请求中包含着自己的网络地址和任期号,也就是说,我们需要发送一个…

    Java 2023年6月5日
    0136
  • 图解CyclicBarrier运动员接力赛

    图解游戏规则 大家都知道运动员短跑接力赛,今天我们并不是讲接力赛,我们讲” 接力协作赛“,需要我们重新定义下游戏规则:如下图所示 现在有运动员A,B,先定义…

    Java 2023年6月8日
    083
  • vue 中,echarts的使用,简单入门

    vue 中,echarts的使用,简单入门 原作者哔哩哔哩视频 感谢 多多支持效果图 首先创建一个页面组件,创建三个div,分别来使用折线图,柱状图,扇形图 //折线图 //柱状图…

    Java 2023年6月16日
    096
  • MyBatis 报错

    org.apache.ibatis.binding.BindingException: Type interface cn.mybatis.mapper.UserMapper is…

    Java 2023年6月7日
    0122
  • Java 多维数组

    二维数组 数组不止能存储某具体值,还能用 数组 储存数组。 介绍: 我们前面学的数组都是一维数组,数组里存储的是具体的值,就是一位数组。 数组不仅可以储存值,还能储存另外一个完整的…

    Java 2023年6月5日
    080
  • js模块化开发

    外部js文件 function a(a,b) {console.log(a+b);} 导出:module.exports ={a}; 引用: import {a} from (路径…

    Java 2023年6月15日
    067
  • spring mvc通过客户端传值,controller获取Sort对象

    之前客户端需要根据需求按不同的排序方式查看数据,按照一种约定排序,比如1代表时间升序,2代表时间降序,3,4这种形式,然后后台根据这些值创建Sort对象。 后来发现完全多此一举,可…

    Java 2023年6月7日
    088
  • nginx上传文件大小限制

    posted @2019-12-27 10:22 _小豪豪 阅读(1310 ) 评论() 编辑 Original: https://www.cnblogs.com/remember…

    Java 2023年5月30日
    088
  • JavaWeb-数据库连接

    ​ 环境 JDK 1.8 Eclipse Mysql 数据库连接类 package com.star.db; import java.sql.Connection; import …

    Java 2023年6月8日
    087
  • 我是虚拟机内核我困惑?!

    内核,是指的操作系统内核。 所有的操作系统都有内核,无论是Windows还是Linux,都管理着三个重要的资源:计算,网络,存储。 计算指CPU和内存,网络即网络设备,存储即硬盘之…

    Java 2023年5月30日
    057
  • Markdowm基础语法的使用(typora)

    Mackdown学习 一级标题:一个#加空格 回车 二级标题:两个#加空格 回车 以此类推… 一级标题(Ctrl+1) 二级标题(Ctrl+2) 三级标题(Ctrl+3…

    Java 2023年6月16日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球