首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

删除一条记录,然后在同一Spring事务中进行选择,仍会返回已删除的记录

在同一Spring事务中进行选择,仍会返回已删除的记录的原因是因为Spring事务的隔离级别默认为READ_COMMITTED(读已提交),该隔离级别下,事务可以读取到其他事务已经提交的数据。

当删除一条记录时,如果在同一事务中进行选择操作,即使该记录已经被删除,由于事务还未提交,所以选择操作仍能读取到该记录。只有当事务提交后,其他事务才能看到删除的结果。

为了解决这个问题,可以通过以下两种方式进行处理:

  1. 在删除记录后,手动清除缓存:在删除记录后,通过调用缓存的清除方法,将该记录从缓存中移除。这样在同一事务中进行选择操作时,会从数据库中读取最新的数据,而不会返回已删除的记录。
  2. 在选择操作中使用悲观锁:在选择操作中使用悲观锁(如数据库的行级锁),可以确保在同一事务中进行选择操作时,读取到的数据是最新的数据,而不会返回已删除的记录。可以通过在选择操作的SQL语句中添加FOR UPDATE语句来实现悲观锁。

需要注意的是,以上两种方式都需要在同一事务中进行操作,以确保事务的一致性和隔离性。同时,具体的实现方式可能会因数据库类型、框架版本等因素而有所差异。

推荐的腾讯云相关产品:腾讯云数据库MySQL、腾讯云数据库TDSQL、腾讯云分布式数据库TDSQL-C、腾讯云数据库TBase等。您可以通过访问腾讯云官网(https://cloud.tencent.com/)了解更多关于这些产品的详细信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

分布式服务 API 幂等设计方案 & Spring Boot + Redis 拦截器实现实例

但是删除要注意ABA问题,即上一次执行删除成功了但是返回了超市,第二次重试执行前,又插入了同样一条数据,那么第二次重试执行就会把本不应该删除数据给删除了。...2、每次处理完请求之后,必须有一个记录标识这个请求处理过了,比如说常见方案是mysql记录个状态啥,比如支付之前记录一条这个订单支付流水,而且支付流水采 3、每次接收请求需要进行判断之前是否处理过逻辑处理...执行这条sql时候,如果有多个线程同时到达这条代码,数据内部会保证update同一条记录会排队执行,最终最有一条update会执行成功,其他未成功,他们num为0,然后根据num来进行提交或者回滚操作...⑦ 服务端根据 Redis 是否存该 key 进行判断,如果存在就将该 key 删除然后正常执行业务逻辑。如果不存在就抛异常,返回重复提交错误信息。...token和用户携带token不一致,也返回false;有且一致,说明是第一次访问,就将redistoken删除然后返回true。

76930

​踩坑|以为是Redis缓存没想到却是Spring事务!

一开始以为缓存维护策略不对,导致数据库和redis出现数据不一致情况。但是经过进一步分析日志,发现问题并不是Redis而是Spring事务。...场景介绍   业务场景如下:用户绑定了设备,需要显示设备列表内,并且可以查看设备信息。   当用户绑定了一个设备,我需要在数据库内新增一条绑定记录。...如果用户再次绑定同一个设备,会将原先记录解绑,再生成一条绑定记录,由于是同一个设备覆盖绑定,则不会去修改用户策略。   如果在设备端或者手机端,进行解绑操作。...并且是由自身代理对象self调用。根据Spring事务传播性来讲,最外层开启了事务,并且通过代理对象调用内部方法,该内部方法也是具有事务。...所以避免耗时操作里加上事物,也就避免了上述问题产生。 总结   实际开发,我们可能一不小心就掉进了Spring事务坑里了,所以对于事务我们需要特别小心。

16640

MySQL InnoDB MVCC机制

同一事务两次相同查询语句都是同样结果, 其他事务修改记录不影响当前事务, 特殊情况是会看到同一事务先前语句所做更新, 所以对于普通select(快照读)来说, MVCC是解决了脏读/不可重复读/幻行...MySQL, 实际上每条记录在更新时候都会同时记录一条回滚操作到undolog(undolog默认mysqldata文件夹)....ReadView时候会删除回滚日志, 即该undolog不再被需要, 但insertundolog日志在事务结束后可以立即删除, 因为如果某个事务ID=100新增了一条记录,那么在这个事务版本之前这个记录是不存在...如果没有找到匹配记录,则无需聚集索引查找。如果找到匹配记录,即使记录被标记删除,也会在聚集索引查找记录 5....只是InnoDB发现当前行事务id已经被更新过, 所以再去查询undolog版本记录, 最终根据会话C开启事务时创建ReadView返回会话B修改后生成数据版本 ref: https://www.cnblogs.com

88000

深入浅出MyBatis:MyBatis与Spring集成及实用场景

AOP AOP称为面向切面编程,所谓切面,是说正常逻辑插入一些逻辑处理代码,比如插入日志记录事务管理等代码,其中,日志记录事务管理就是切面。...这就是切入点,Spring可以通过正则进行配置; 切面:上面已经介绍了,日志记录事务管理等需要处理逻辑对象,就是切面; 连接点:它是程序运行根据不同通知来实现程序段,通知包括,前置通知、后置通知...、异常后通知、正常返回后通知、环绕通知; Spring 事务管理 在编写业务代码时,一个业务方法可能涉及多张表或多条sql语句,同一条表数据可能会被同时访问,数据库事务控制很重要,通过Spring AOP...事务隔离级别 读未提交:可能出现脏读问题,一个事务读取另一个事务未提交数据; 读已提交:可能出现不可重复读问题,针对同一条记录同一事务前后可能读取不同数据; 可重复读:可能出现幻读问题,针对删除和插入记录...,同一个查询条件,同一事务返回记录数可能不同; 序列化:所有操作会按顺序执行; MySql默认隔离级别为可重复读。

88190

面试官:消息队列,消息可靠性、重复消息、消息积压、利用消息实现分布式事务如何实现...

如果Broker没有收到消费确认响应,下次拉消息时候还会返回同一条消息,确认消息不会在网络传输过程丢失,也不会因为客户端执行消费逻辑中出错导致丢失 在编写消费代码时需要注意是,不要在收到消息后就立即发送消费确认...ID这两个字段联合起来创建一个唯一约束,这样对于相同转账单ID和账户ID,表里至多只能存在一条记录 这样,消费消息逻辑可以变为:转账流水表增加一条转账记录然后再根据转账记录,异步操作更新用户余额即可...转账流水表增加一条转账记录这个操作,由于在这个表预先定义了账户ID转账单ID唯一索引,对于同一个转账单同一个账户只能插入一条记录,后续重复插入操作都会失败,这样就实现了一个幂等操作 只要是支持类似...因为从购物车删除下单商品这个步骤,并不是用户下单支付这个主要流程必需步骤,使用消息队里来异步清理购物车是更加合理设计 对于订单系统来说,它创建订单过程实际上执行了2个步骤操作: 订单库插入一条订单数据...订单库创建一条订单记录,并提交订单库数据库事务

51710

消息可靠性、重复消息、消息积压、利用消息实现分布式事务

如果Broker没有收到消费确认响应,下次拉消息时候还会返回同一条消息,确认消息不会在网络传输过程丢失,也不会因为客户端执行消费逻辑中出错导致丢失 在编写消费代码时需要注意是,不要在收到消息后就立即发送消费确认...ID这两个字段联合起来创建一个唯一约束,这样对于相同转账单ID和账户ID,表里至多只能存在一条记录 这样,消费消息逻辑可以变为:转账流水表增加一条转账记录然后再根据转账记录,异步操作更新用户余额即可...转账流水表增加一条转账记录这个操作,由于在这个表预先定义了账户ID转账单ID唯一索引,对于同一个转账单同一个账户只能插入一条记录,后续重复插入操作都会失败,这样就实现了一个幂等操作 只要是支持类似...,然后清理购物车,购物车删除订单商品 问题关键点集中订单系统,创建订单和发送消息这两个步骤要么都操作成功,要么都操作失败,不允许一个成功而另一个失败情况出现 1、什么是分布式事务?...订单库创建一条订单记录,并提交订单库数据库事务

1.2K20

微服务架构-消息队列常见问题和解决方案

如果Broker没有收到消费确认响应,下次拉消息时候还会返回同一条消息,确认消息不会在网络传输过程丢失,也不会因为客户端执行消费逻辑中出错导致丢失 在编写消费代码时需要注意是,不要在收到消息后就立即发送消费确认...ID这两个字段联合起来创建一个唯一约束,这样对于相同转账单ID和账户ID,表里至多只能存在一条记录 这样,消费消息逻辑可以变为:转账流水表增加一条转账记录然后再根据转账记录,异步操作更新用户余额即可...转账流水表增加一条转账记录这个操作,由于在这个表预先定义了账户ID转账单ID唯一索引,对于同一个转账单同一个账户只能插入一条记录,后续重复插入操作都会失败,这样就实现了一个幂等操作 只要是支持类似...因为从购物车删除下单商品这个步骤,并不是用户下单支付这个主要流程必需步骤,使用消息队里来异步清理购物车是更加合理设计 对于订单系统来说,它创建订单过程实际上执行了2个步骤操作: 1、订单库插入一条订单数据...订单库创建一条订单记录,并提交订单库数据库事务

51320

消息队列:消息可靠性、重复消息、消息积压、利用消息实现分布式事务

如果Broker没有收到消费确认响应,下次拉消息时候还会返回同一条消息,确认消息不会在网络传输过程丢失,也不会因为客户端执行消费逻辑中出错导致丢失 在编写消费代码时需要注意是,不要在收到消息后就立即发送消费确认...ID这两个字段联合起来创建一个唯一约束,这样对于相同转账单ID和账户ID,表里至多只能存在一条记录 这样,消费消息逻辑可以变为:转账流水表增加一条转账记录然后再根据转账记录,异步操作更新用户余额即可...转账流水表增加一条转账记录这个操作,由于在这个表预先定义了账户ID转账单ID唯一索引,对于同一个转账单同一个账户只能插入一条记录,后续重复插入操作都会失败,这样就实现了一个幂等操作 只要是支持类似...,然后清理购物车,购物车删除订单商品 问题关键点集中订单系统,创建订单和发送消息这两个步骤要么都操作成功,要么都操作失败,不允许一个成功而另一个失败情况出现 1、什么是分布式事务?...订单库创建一条订单记录,并提交订单库数据库事务

1.9K20

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day04】——Java高级篇

脏读 A事务一条记录进行修改 尚无提交 B事务已经看到了A修改结果 若A发生回滚 B读到数 据就是错误 不可重复读         A事务一条记录进行修改 尚无提交 B事务第一次查询该记录...看到是修改之后结果 此时 A发生回滚 B事务又一次查询该记录 看到是回滚结果 同一事务内 B两次查询结果不一致 这 就是不可重复读 幻读         A事务对所有记录进行修改 尚未提交...此时B事务创建了一条记录 A B都提交 A查看所有数 据 发现有一条数据没有被修改 因为这是B事务新增 就像看到幻象一样 这就是幻读 非重复度和幻像读区别:         非重复读是指同一查询同一事务多次进行...,由于其他提交事务所做修改或删除,每次返回不同结果集,此时发生非重复读。         ...幻像读是指同一查询同一事务多次进行,由于其他提交事务所做插入操作,每次返回不同结果集,此时发生幻像读。

18130

Hibernate_day01总结

tx.commit(); // 释放资源 session.close(); } 1.5.4 删除一条记录: @Test /** * 删除一条记录 */ publicvoid delete() { //...Transaction tx = session.beginTransaction(); // 执行操作: // 删除方式一:创建新对象然后删除....:Java中区分是否是同一个对象.对象地址.数据库中区分是否是同一条记录.主键.Hibernate中区分对象在内存是否是同一个?...(short,int,long).采用是hibernate自动增长,不是使用数据库底层自动增强. * select max(id) from Customer; 将最大值加1作为下一条记录主键.... assigned :主键Hibernate不进行管理.需要自己程序设置主键. foreign :主要使用在一对一关联关系. 1.8.5 复合主键配置: 配置: <hibernate-mapping

1.3K90

Mysql详解

3)使用自增主键则可以避免上述问题: 【1】自增主键值是顺序,所以Innodb把每一条记录都存储一条记录后面。...【2】并发事务处理带来问题 问题 说明 更新丢失(Lost Update)或脏写 当两个或多个事务选择同一行,然后基于最初选定值更新该行时,由于每个事务都不知道其他事务存在,就会发生丢失更新问题–...脏读(Dirty Reads) 一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,...【8】对于删除情况可以认为是update特殊情况,会将版本链上最新数据复制一份,然后将trx_id修改成删除操作trx_id,同时该条记录头信息(record header)里(deleted_flag...)标记位写上true,来表示当前记录已经被删除查询时按照上面的规则查到对应记录如果delete_flag标记位为true,意味着记录已被删除,则不返回数据。

44920

科普 | 几个小案例帮你搞懂MVCC实现原理

悲观锁保证同一时间只能有一个线程访问,默认数据访问时候会产生冲突,然后整个过程都加上了锁。...当删除一条数据时会将版本链上最新数据复制一份,然后将 trx_id 修改为删除 trx_id,同时记录头信息存在一个 delete flag 标记,将这个标记写上 true,用来表示当前记录已经删除...read-view 是根据同一事务一条快照读产生,再来看一个案例。...此时事务 ID101 也再对数据更新两次,然后进行查询看一下会返回什么值: ? 经过案例一、案例二熟悉,现在对 undo log 版本链和对比规则已经有了一定了解了吧!...小结:同一事务进行查询,会沿用第一次查询语句生成 read-view(前提是隔离级别是可重复读)。 通过以上四个案例,版本链寻找过程,可以总结出一个小技巧: ?

1.1K10

spring事务(上)

T1时刻开启了事务1,T2时刻开启了事务2, T3时刻事务1从数据库取出了id="402881e535194b8f0135194b91310001"数据, T4时刻事务2取出了同一条数据, T5...T1时刻开启了事务1,T2时刻开启了事务2, T3时刻事务1从数据库查询所有记录记录总共有一条, T4时刻事务2向数据库插入一条记录,T6时刻事务2提交事务。...T1时刻开启了事务1,T2时刻开启了事务2, T3时刻事务1从数据库取出了id="402881e535194b8f0135194b91310001"数据,此时age=20, T4时刻事务2查询同一条数据...这种情况就是"不可重复读(unrepeated read)" 第二类丢失更新(second lost updates) 覆盖丢失 不可重复读特殊情况,如果两个事务都读取同一行,然后两个都进行写操作,并提交...写锁比读锁优先级更高,即使有读操作排在队列,一个被申请写锁仍可以排在所队列前列。 行级锁仅对指定记录进行加锁 这样其它进程可以对同一个表其它记录进行读写操作。

75530

一篇文章彻底搞懂Mysql事务相关原理

客户端A创建一个包含两个索引记录(90和102)表,然后启动一个事务,该事务将排他锁放置ID大于100索引记录上。...此外,删除在内部被视为更新,该更新,行特殊位被设置为将其标记为删除。每行还包含一个7字节 DB_ROLL_PTR字段,称为滚动指针。回滚指针指向写入回滚段撤消日志记录。...当二级索引记录删除标记或二级索引页由较新事务更新时,InnoDB聚集索引查找数据库记录。...而不是从索引结构返回值,而是InnoDB聚集索引查找记录。...将选择索引添加到表然后,您查询需要扫描较少索引记录,因此设置较少锁。使用EXPLAIN SELECT以确定哪些索引MySQL认为最适合您查询。 使用更少锁定。

76810

MVCC

,mysql中使用了大量缓存,修改操作时会直接修改内存,而不是立刻修改磁盘,事务进行时会不断产生redo log,事务提交时进行一次flush操作,保存到磁盘。...为演示,插入提交后,该undo log被删除 二、 现在来了一个事务1对该记录name做出了修改,改为Tom 事务1修改该行(记录)数据时,数据库会先对该行加排他锁 然后把该行数据拷贝到undo log...副本记录,既表示我上一个版本就是它 事务提交后,释放锁 三、 又来了个事务2修改person表同一记录,将age修改为30岁 事务2修改该行数据时,数据库也先为该行加锁 然后把该行数据拷贝到undo...那就是2,回滚指针指向刚刚拷贝到undo log副本记录 事务提交,释放锁 记录版本链 从上面,我们就可以看出,同一记录多次修改,会导致该记录undo log成为一条记录版本线性表,既链表,undo...和undo log 做对比得到结果 比较规则: 依次比较记录版本链一条记录,符合规则就返回该条数据,不符合根据回滚指针取链路一条数据; trx_id为记录版本链里DB_TRX_ID 1、如果

71330

Spring 事务介绍(一)之 数据库事务基本特性

Spring 事务介绍(一)之 数据库事务基本特性 数据库事务基本特性 事务是区分文件存储系统和Nosql数据库重要特性之一,其存在意义是为了保证即时并发情况下,也能正确执行crud操作...很多时候我们有些业务对事务要求是不一样,所有数据库设计了四种隔离级别,供用户基于业务进行选择。...不可重复读: 同一事务,多次读取同一数据返回结果有所不同,换句话说,后面读取可以读到另一个事务已提交更新数据,相反,“可重复读”同一事务多次读取数据时,能够保证所读数据一样,也就是后续读取不能读取到另一事务所提交更新数据...幻读场景描述: 设置id为主键,两个同时进行事务,如果此时事务t1做插入(id=1),事务t2按主键查询(id=1)因为此时为TRANSACTION_REPEATABLE_READ级别 ,所以查询为空...,然后进行插入(id=1) 此时会出现主键冲突异常,这种情况主要是由MVCC导致,t2查询数据因为没有改动所以是之前保留查询数据,为快照版本,但实际上数据库已经新增了一条,此时进行插入,就抛出主键冲突异常了

60820

这六个 MySQL 死锁案例,能让你理解死锁原因!

起初业务程序思路是这样: 投资人投资后,将金额随机分为几份,然后随机从借款人表里面选几个,然后通过一条条select for update 去更新借款人表里面的余额等。...众所周知,InnoDB上删除一条记录,并不是真正意义上物理删除,而是将记录标识为删除状态。(注:这些标识为删除状态记录,后续会由后台Purge操作进行回收,物理删除。...但是,删除状态记录会在索引存放一段时间。) RR隔离级别下,唯一索引上满足查询条件,但是却是删除记录,如何加锁?...因此,为了修改一条记录,InnoDB内部如何处理: 根据给定查询条件,找到对应记录所在页面; 对页面加上X锁(RWLock),然后页面内寻找满足条件记录持有页面锁情况下,对满足条件记录事务锁...,有可能删除同一条记录,并且保证删除记录一定存在; 事务隔离级别设置为Repeatable Read,同时未设置innodb_locks_unsafe_for_binlog参数(此参数默认为FALSE

93940

干货 | 携程最终一致和强一致性缓存实践

由于有多个触发源,不同触发源之间可能会对同一条数据缓存更新请求出现并发,此外可能出现同一条数据极短时间内(如1秒内)更新多次,无法区分数据更新顺序,因此需要做两方面的操作来确保数据更新准确性。...举个例子:假设同一秒内同一条数据出现了两次更新,value=1和value=2,期望最终缓存数据是value=2。...事务提交后,对应变更记录持久化,之后进行删除缓存,若缓存删除成功,则将对应记录表数据也删除掉。...若缓存删除失败,则可根据记录数据进行补偿删除,而在redis恢复流程,需要校验记录是否存在数据,若存在则表示有变更后数据对应缓存未清除,不可进行缓存读取恢复。...简单来说,该机制提供了Spring环境事务执行前后AOP功能,可以spring事务执行前后添加自己操作,如下所示(代码和注释经过了简化): public interface TransactionSynchronization

1.2K31

Spring认证中国教育管理中心-Spring Data Redis框架教程二

这些操作 上可用RedisTemplate。但是,RedisTemplate不能保证同一个连接运行事务所有操作。...以前,这些方法直接从连接器返回事务结果。这意味着数据类型通常与从 方法返回数据类型不同RedisConnection。例如,zAdd返回一个布尔值,指示元素是否添加到排序集中。...正在进行事务期间发出命令被排队,并且仅在提交事务时应用。 Spring Data Redis 正在进行事务中区分只读和写命令。...当您需要连续发送多个命令时,流水线可以提高性能,例如将许多元素添加到同一个 List。 Spring Data Redis 提供了多种RedisTemplate管道运行命令方法。...results List包含了所有的弹出项目。RedisTemplate返回之前使用其值、哈希键和哈希值序列化器对所有结果进行反序列化,因此前面示例返回项是字符串。

1.3K20

并发锁 (四) : innodb 事务

2:之后,更新操作: update test set name= 'new_value' where id=1; 先标记旧那行记录删除,并且删除版本号是事务版本号,然后插入一行新记录方式。...(即上述事务id为2事务查询时,依然能读取到事务id为3所删除数据行) 2) 创建版本号 小于或者等于 当前事务版本号 ,就是说记录创建是在当前事务(等于情况)或者在当前事务启动之前其他事物进行...事务保存点允许我们可以mysql事务处理过程定义保存点(SAVEPOINT),然后回滚到指定保存点前状态。...;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步处理,就会产生未提交数据依赖关系。...这种隔离级别 也支持所谓不可重复读(Nonrepeatable Read),因为同一事务其他实例该实例处理其间可能会有新commit,所以同一select可能返回不同结果。

38120
领券