事务的范围比锁的范围大

请看场景:

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

相关推荐
Moshow郑锴39 分钟前
sql-pipeline - 基于PostgreSQL的SQL健康检查与发布编排平台
java·sql
weixin_307779134 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天7 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel7 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog8 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
Elastic 中国社区官方博客8 小时前
将你自己的密钥用于现有 Elastic Cloud 部署
大数据·数据库·elasticsearch·全文检索
2601_962071578 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
红海云9 小时前
Jev:给智能系统做判断的模型
大数据·数据库·人工智能
wjkjpcba9 小时前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
꯭自꯭闭꯭9 小时前
达梦事物特性及MVCC
linux·运维·数据库