事务的范围比锁的范围大

请看场景:

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

相关推荐
zxrhhm13 小时前
Oracle 19c RAC 默认表空间类型的管理及总结
数据库·oracle
逻辑驱动的ken13 小时前
Java高频面试考点场景题15
java·开发语言·深度学习·面试·职场和发展·高效学习
juniperhan13 小时前
Flink 系列第19篇:深入理解 Flink SQL 的时间语义与时区处理:从原理到实战
java·大数据·数据仓库·分布式·sql·flink
是有头发的程序猿13 小时前
AI agent电商运营成本管控:1688运费核算及自动下单付款Python实操教程
大数据·开发语言
这是程序猿13 小时前
MySQL 索引一篇讲透:原理、分类、优化与面试总结
java·前端·mysql
Irene199113 小时前
Oracle 聚合函数 vs 窗口函数 对比总结(书写顺序与执行顺序示例)
数据库
weixin_3812881813 小时前
HTML5中Noscript标签在脚本禁用环境下的补救
jvm·数据库·python
weixin_5206498713 小时前
Winform创建与启动
开发语言·c#
无籽西瓜a13 小时前
MD5算法原理、适用场景
java·后端·算法·哈希算法·md5