因为在controller进行锁,没有所需要的业务参数,从而在service加锁,然后service执行完成解锁。
就会存在没有提交事务而锁释放了,造成第二个请求进来数据脏读。有什么好的解决办法吗
Controller调用第一个Service(加锁、释放锁),第一个Service再调用第二个Service(事务控制部分)
示例,修改前
HelloController
--HelloService
事务开始
加锁
// 业务代码
解锁
事务结束
示例,修改后
HelloController
--LockService
加锁
--HelloService
事务开始
// 业务代码
事务结束
解锁
你可以在service做手动事务提交
(1)应该谁加锁谁释放,而不是service加锁,调用者释放
(2)最好用aop,统一对事务管理
解锁的操作,很快,因为纯内存操作
事务的提交,没解锁的快,因为涉及到DB
解锁 和 提交事务,这两个操作之间,是可能会出现信息差
处理这个问题,可以在客户端做操作,限制请求的间隔,防止重复提交;可以在服务端做操作,在controller加锁,Controller为什么没有加锁参数? service的参数,不都是controller传入进去的?