事务的范围比锁的范围大

请看场景:

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

相关推荐
youxiao_901 分钟前
MySQL主从高可用工具--MHA
数据库·mysql
rit84324994 分钟前
LTE系统资源分配MATLAB实现示例(基于OFDMA的动态调度)
开发语言·matlab
云和恩墨6 分钟前
打造数据库安全堡垒:统一自动化监控平台在DBA运维中的价值解析
运维·数据库·安全·自动化·dba
Tony6666888887 分钟前
Webservic 服务注册发布及参数封装-实际项目应用
java·spring·servlet
老华带你飞10 分钟前
零食商城|基于springboot + vue零食商城管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·毕设
chilavert31813 分钟前
技术演进中的开发沉思-231 Ajax:页面内容修改
开发语言·前端·javascript
李日灐13 分钟前
C++STL:熟悉vector的底层实现,部分源码解析,迭代器失效和深层次浅拷贝
开发语言·c++
wuk99818 分钟前
基于MATLAB的混合动力汽车(HEV)简单整车模型实现
开发语言·matlab·汽车
偶像你挑的噻18 分钟前
1.Qt-编译器基本知识介绍
开发语言·qt
songgz19 分钟前
多线程双向 JSON 解析器
java·服务器·json