事务的范围比锁的范围大

请看场景:

复制代码
@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):使用方法获取动态对象。

相关推荐
zandy1011几秒前
衡石科技 HENGSHI SENSE:一站式智能分析平台,让企业数据价值“所见即所得”
大数据·数据库·科技
_童年的回忆_2 分钟前
【Java】宝塔下安装Adoptium Temurin (免费JDK)
java·开发语言
想带你从多云到转晴4 分钟前
04、数据结构与算法---双向链表
java·数据结构·算法·链表
阿里加多5 分钟前
第 5 章:Go 内存模型与 Happens-Before 原则
开发语言·后端·golang
fly spider6 分钟前
MySQL日志篇
数据库·mysql
Flittly10 分钟前
【SpringAIAlibaba新手村系列】(17)百炼 RAG 知识库应用
java·人工智能·spring boot·spring·ai
QC·Rex12 分钟前
向量数据库对比与实战:从原理到生产落地
数据库·人工智能·向量数据库
Database_Cool_15 分钟前
PolarDB分布式版 AI 助手正式上线:你的“数字DBA”已入职
数据库·阿里云·ai
一叶飘零_sweeeet15 分钟前
MySQL 生产级备份与恢复全攻略:全量 / 增量 / 逻辑 / 物理备份深度拆解 + 误删数据秒级恢复实战
数据库·mysql·数据安全·数据备份
网域小星球16 分钟前
C 语言从 0 入门(二十)|指针进阶:指针数组、数组指针与函数指针
c语言·开发语言·函数指针·数组指针·指针进阶