事务的范围比锁的范围大

请看场景:

复制代码
@Servicepublic class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public synchronized void isertUser4(User user) {
// 实际中的具体业务......
userMapper.insertUser(user);
}
}

当我们在数据库插入数据时,要求一个用户只能出现一次,即如果这个用户不存在则插入,不存在则更新。当我们用压测测试这段代码,会发现数据库中有两条以上的同一个用户,这与我们要求的只有一个用户不同。

原因:因为事务的范围比锁的范围大,当我们执行完这个方法,锁已经释放,由其他线程拿到这个锁来重新执行这段代码,但是这个时候,事务的内容还没有写入数据库,我们第二个锁进来判断数据库是否有值判断的肯定是为空,这第二个线程就会又进行插入,而不是进行修改。

解决方法:在调用事务方法的地方加锁,这样保证锁的范围比事务的范围大。

可能产生新的问题:

如果是在同一类当中,直接在加锁的地方调用这个类的另外一个方法(增加了事务的方法),这样是属于this调用。不是动态调用则事务的不起作用。

解决方法:使用动态调用

(1):自己依赖自己,自己将自己自动注入。

(2):使用方法获取动态对象。

相关推荐
杨了个杨89822 分钟前
PostgreSQL 完全备份与还原
数据库·postgresql
爱吃KFC的大肥羊3 分钟前
Redis持久化详解(一):RDB快照机制深度解析
数据库·redis·缓存
黎明破晓.6 分钟前
Redis
数据库·redis·缓存
wasp5207 分钟前
AgentScope深入分析-设计模式与架构决策分分析
开发语言·python·agent·agentscope
ALex_zry8 分钟前
现代C++如何解决传统内存分配器的核心痛点
java·c++·spring
山土成旧客9 分钟前
【Python学习打卡-Day26】函数的艺术(上):从基础定义到参数魔法
开发语言·python·学习
Coder_Boy_11 分钟前
【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音控制-Java部分核心逻辑
java·开发语言·人工智能·单片机
MACKEI11 分钟前
业务域名验证文件添加操作手册
java·开发语言
roman_日积跬步-终至千里11 分钟前
【源码分析】StarRocks EditLog 写入与 Replay 完整流程分析
java·网络·python
Dovis(誓平步青云)12 分钟前
《MySQL从入门:基础安装与数据库核心概念全解析》
数据库·mysql