背景:今天遇到一个问题,在一个长事务中,我调用服务a去写数据(redis数据库不支持事物),然后调我的服务去写这个数据,但是我主数据库是事务型数据库。当我事务失败会滚的时候,服务a去写的数据并没有做相应的会滚动作。导致重新发起调用的时候,数据库没有值,但是redis有值,我的处理逻辑是redis有值我就不会去进行写操作了,直接查回去就行了。所以尴尬的是我的主数据库里面永远丢失了这条数据。(业务要求数据无论成功与否都最好写入数据库中)

于是乎:

1、我对写入主数据库的方法做了异步,保证事务异常仍然不会会滚数据。

2、我对还没提交事务的时候的数据优先查询redis的数据。

保障了数据是最新的,而且在第二次使用数据的时候,数据库里面因为异步也会存在该数据。

但是我发现,debug模式下,打断点在异步方法中,主线程并没有继续执行,而是等待。但是事务失败后,该数据仍然对主数据库进行了写入操作

什么是事务?

事务必须服从ACID原则。ACID指的是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。 通俗理解,事务其实就是一系列指令的集合

  • 原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
  • 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
  • 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
  • 持久性:当事务正确完成后,它对于数据的改变是永久性的。

什么是锁?

锁是用于解决隔离性的一种机制。另外锁有不同的粒度,同时事务也是有不同的隔离级别的(一般有四种:读未提交Read uncommitted, 读已提交Read committed, 可重复读Repeatable read, 可串行化Serializable)。 在具体的程序设计中,开启事务其实是要数据库支持才行的,如果数据库本身不支持事务,那么仍然无法确保你在程序中使用的事务是有效的。 锁可以分为乐观锁和悲观锁: 悲观锁:认为在修改数据库数据的这段时间里存在着也想修改此数据的事务; 乐观锁:认为在短暂的时间里不会有事务来修改此数据库的数据; 我们一般意义上讲的锁其实是指悲观锁,在数据处理过程中,将数据置于锁定状态(由数据库实现)

关于乐观锁和悲观锁文章可以看看这个https://www.jianshu.com/p/d2ac26ca6525

回答一下初衷:锁究竟锁住的什么?java的锁会锁住锁住当前对象的线程换言之java方法栈的内存数据,事务为实现隔离型也有锁这个锁一般是数据库级别的锁,不只是单单锁对象。

锁究竟锁住的是什么?相关推荐

  1. 【转】【MySQL】事务与锁(四):行锁到底锁住的是什么?记录?字段?索引?

    首先我们有三张表t1,t2,t3,它们都是只有两个字段, int类型的id和varchar类型的name:区别是t1没有索引,t2有主键索引,t3有唯一索引. 再强调一次,在实验前必须提前关闭自动提交 ...

  2. select .... for update究竟锁表还是锁行?

    文章目录 介绍 实例验证 实例前准备数据 实例1--验证通过主键索引查询会锁行 实例2--验证通过普通索引作为查询条件会锁行 实例3--验证查询条件不命中索引会锁表 实例4--验证联合索引匹配到第一个 ...

  3. [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)

    不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...

  4. java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

    转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...

  5. mysql分析表锁,MySQL锁分析和监控

    通常在MySQL的管理和监控中,Active Session(活动会话)是监控指标中的一个很重要的指标,通过活动会话监控,可以很清楚的了解到数据库当前是否有SQL堆积,是否处于非常繁忙的状态.那么除了 ...

  6. mysql 乐观锁 脏读_mysql 丢失更新1和2、脏读、不可重复读和幻读 事务隔离级别 悲观锁 乐观锁...

    事务是现代关系型数据库的核心之一.在多个事务并发操作数据库(多线程.网络并发等)的时候,如果没有有效的避免机制,就会出现以下几种问题: ( 第一类丢失更新 A事务撤销时,把已经提交的B事务的更新数据覆 ...

  7. Mysql之乐观锁悲观锁:乐观锁检查数据状态 悲观锁更新时锁定数据

    1.问题来源 就是一数据表的数据  在两个人同时修改的时候  会出现混乱 例子:如一个字段记录status=1 表示可以下单  货品只有1个的时候    a下单的同时b也下单 : a有修改status ...

  8. java 单例 读写锁_终极锁实战:单JVM锁+分布式锁

    目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的典型场景:多 ...

  9. java synchronized关键字锁和锁类型、锁升级过程讲解

    概述 synchronized是java的一个关键字,用于对方法或者代码块添加一个同步锁,以实现操作的原子性,保证线程安全性,但是却会带来一些性能上的损耗. 这个关键字添加的是可重入锁,也就是同一个线 ...

最新文章

  1. C#的基础琐碎总结-----委托
  2. Python之operator库
  3. 表单的重复提交问题解决方案
  4. 【Python】raise ValueError(Too many dimensions: %d %d. % (ndim, ndmax))问题
  5. Java编程语言的历史和未来
  6. 光端机怎样使用?光端机怎么和交换机连接?
  7. java-io流理解
  8. 如何在linux mysql_如何在linux下安装mysql
  9. 计算机毕业设计中Python Django 框架目录结构简介
  10. Codeforces Beta Round #7 C. Line 扩展欧几里德
  11. 获取 Adobe Creative Cloud 2023 创意应用软件,解锁无限创造力
  12. 身为码农,为12306说两句公道话
  13. 有向图和无向图用邻接矩阵储存
  14. 学习Vue3 第七章(认识Reactive全家桶)
  15. 灵魂讲师分享的:po是什么?自动化测试po分层如何实现?-带po详细源代码
  16. uniapp唤醒手机地图app
  17. hdu—5984 Pocky(概率)
  18. linux中execve的用法,Linux 的 execve 函数
  19. matlab求解微分代数方程组,微分代数方程(DAE)的Matlab 解法.PDF
  20. Flowable-6.6.0 工作流引擎(windows平台zip包)下载

热门文章

  1. php事务处理深入学校,php事务处理实例详解
  2. mac 黑窗口连接mysql_Mac系统Python、PyCharm安装及使用方法详解
  3. c语言程序中unit怎么定义,c ++中的一个定义规则(One definition rule in c++)
  4. php视频生成指定帧图片,python3.5 cv2 获取视频特定帧生成jpg图片
  5. python好多模块和c相识_快速实现python c扩展模块
  6. select html value属性,HtmlSelect.DataValueField 属性 (System.Web.UI.HtmlControls) | Microsoft Docs...
  7. 【机器学习算法专题(蓄力计划)】七、机器学习中数据的相关分析
  8. 七十九、TodoList示例 深入Redux的工作流
  9. 七十一、Vue项目城市选择页搜索逻辑实现,边输入边搜索功能的解决办法:节流函数
  10. pyqtgraph初探