我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring强大事务兼容数据库多种组合解决业务需求

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring强大事务兼容数据库多种组合解决业务需求

事物的由来

在mysql中只有innodb存储引擎才支持事物,所以我们后续都是基于innodb来展开的

事物特性

事物是用来保证数据的完整性的,保证批量sql执行的统一性;事物具有四个特性: A(Atomicity)、C(Consistency)、I(Isolation)、D(Durability)

原子性

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

持久性

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

基于四个特性,我们就需要在数据和性能进行权衡,需要比较下场景。在m y s q l中就存在四种隔离级别。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

隔离级别脏读(Dirty Read)不可重复读(NonRepeatable Read)幻读(Phantom Read)
未提交读(Read uncommitted)可能可能可能
已提交读(Read committed)不可能可能可能
可重复读(Repeatable read)不可能不可能可能
可串行化(Serializable )不可能不可能不可能
  • 之前我一直错误的认为mysql中默认的是读已提交。后来查阅资料才知道默认的是可重复读隔离级别。

什么事脏读、不可重复读、幻读

上面提到了三种异常数据情况,作为一名合格的程序员我们需要知道不同的隔离级别会给我们造成具体什么样的伤害。

脏读

脏读指的是A事物在操作数据,还未进行提交此时B事物就已经感知到数据的变化了。这是我们最不能接受的。这里以个人举例,大学期间看中一款手机但是囊中羞涩需要爸妈支援下,打电话让爸妈赚钱这里我们理解成A事物,我着急用钱我是B事物,此时A事物向zxh这张表新增了money=5000元的一条数据。B事物在修改zxh这张表中money这个字段。如果我们是读未提交隔离级别。那么A事物刚新增完事物还未提交,B事物却已经可以修改了。那么B事物修改成功后就结束了。这个时候如果A事物因为别的原因出现异常了。那么就需要将add的5000进行回滚,回滚后余额出现负数。这个负数对于银行来说就是坏账。

#### 不可重复读

-   顾名思义就是同一条数据多次读取并不能保证数据一致性。这是因为A事物第一次读完数据后B事物修改了相同的数据行。那么A事物在此读取该数据就会发生不可重复读。

#### 幻读

-   不可重复读是针对同一条数据内容的变化。而幻读针对的是表记录的变化。还是A事物第一次查询数据匹配到10条,第二次相同条件匹配到的是20条。这就是幻读。
复制代码

查询

s q l功能
select @@tx_isolation;查询数据库默认隔离级别
select @@global.tx_isolation;查看系统当前隔离级别
set session transaction isolation level repeatable read;设置当前会话隔离级别
set global transaction isolation level repeatable read;设置系统当前隔离级别
  • mysql 四种隔离级别对应关系 ; 设置时候去掉破折号就行了

REPEATABLE-READ

READ-COMMITTED

READ-UNCOMMITTED

SERIALIZABLE

  • 我们也可以通过show来查看相关配置
show variables like '%iso%';

spring事物

 @Override
 public Map<String, Object> startTransaction(Transmodel transmodel) {
   int insert = transMapper.insert(transmodel);
   log.info("操作日志:" + insert);
   if ("zxhtom".equals(transmodel.getName())) {
     throw new RuntimeException("error");
   }
   return new HashMap<>();
 }
复制代码
  • 上面代码逻辑非常的简单,当我们传送如下参数时就会报错
   {
     "name": "zxhtom",
     "code": "56",
     "age": 34
 }
复制代码
  • 但是呢?我们再去数据库查看,发现该数据进入数据库了。

  • 发生这种场景时不行的,在互联网中我们要求部分接口必须具有原子性,中途报错之前所有的操作就必须回滚。如果我们自己使用jdbc那么直接通过连接对象rollback就行了。
  • 在spring中因为连接session对接管了,我们就不必那么麻烦了,直接通过@Transactional标注我们的方法就可以实现事物了。
 @Transactional
 public Map<String, Object> startTransaction(Transmodel transmodel) {
   int insert = transMapper.insert(transmodel);
   log.info("操作日志:" + insert);
   if ("zxhtom".equals(transmodel.getName())) {
     throw new RuntimeException("error");
   }
   return new HashMap<>();
 }
复制代码
  • 在此执行就会发现,数据并没有新增,这就是我们想要的效果

spring事物有哪些可配项

  • 里面有几个属性我们需要关注下。已经圈出来了。

字段作用
value事物管理器;用于提交和回滚的功能;默认的DataSourceTransactionManager内部时datasource来操作提交回滚的
transactionManager事物管理器;用于提交和回滚的功能;默认的DataSourceTransactionManager内部时datasource来操作提交回滚的
propagation传播属性;spring中方法内方法事物传递属性设置
isolation隔离级别,在数据库基础上新增一个默认以数据库隔离级别为准
timeout超时事物不提交
readOnly这个感觉没啥意义,被标注的方法无法执行更新操作,只能select
rollbackFor导致事务回滚的异常类数组
rollbackForClassName导致事务回滚的异常类名字数组
noRollbackFor不会导致事务回滚的异常类数组
noRollbackForClassName不会导致事务回滚的异常类名字数组

传播属性

  • 传播属性spring为我们建立了枚举
 public enum Propagation {
   REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
   SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
   MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
   REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
   NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
   NEVER(TransactionDefinition.PROPAGATION_NEVER),
   NESTED(TransactionDefinition.PROPAGATION_NESTED);
   private final int value;
   Propagation(int value) {
     this.value = value;
   }
   public int value() {
     return this.value;
   }
 }

以上就是Spring强大事务兼容数据库多种组合解决业务需求的详细内容,更多关于Spring事务解决业务需求的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring强大事务兼容数据库多种组合解决业务需求

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录