java业务相关的分布式锁在service锁住,如何在提交事务的时候同时解开锁

因为在controller进行锁,没有所需要的业务参数,从而在service加锁,然后service执行完成解锁。
就会存在没有提交事务而锁释放了,造成第二个请求进来数据脏读。有什么好的解决办法吗

可以通过拆分一个Service的事务、锁的两部分工作,拆成2个Service,

Controller调用第一个Service(加锁、释放锁),第一个Service再调用第二个Service(事务控制部分)

示例,修改前

HelloController
   --HelloService
               事务开始
                 加锁
                     // 业务代码
                     解锁
                 事务结束

示例,修改后

HelloController
   --LockService
            加锁
              --HelloService
                   事务开始
                         // 业务代码
                    事务结束
            解锁

你可以在service做手动事务提交

(1)应该谁加锁谁释放,而不是service加锁,调用者释放
(2)最好用aop,统一对事务管理

解锁的操作,很快,因为纯内存操作
事务的提交,没解锁的快,因为涉及到DB

解锁 和 提交事务,这两个操作之间,是可能会出现信息差

处理这个问题,可以在客户端做操作,限制请求的间隔,防止重复提交;可以在服务端做操作,在controller加锁,Controller为什么没有加锁参数? service的参数,不都是controller传入进去的?