java事务锁 java lock 中锁与 @Transactional 同时使用导致锁失效的问题

文章目录

第一种

比较多的, 事物没提交,下一个线程获取到的还是 上一个线程 未提交的数据

错误代码示例
这段代码执行顺序是

开启事务 -> 获取锁 -> 执行业务代码 -> 解锁 -> 事务提交

	private final Lock lock = new ReentrantLock(true);
	
	@Transactional(rollbackFor = Exception.class)
	public void update() {
    
    
		try {
    
    
			lock.lock();
			// 业务代码
		} catch (Exception e) {
    
    
			e.printStackTrace();
			// 抛出异常,不然 事物回滚会失效
			throw new RuntimeException("操作异常");
		} finally {
    
    
			lock.unlock();
		}
	}

修改代码示例
这段代码执行顺序是

获取锁 -> 开启事务 -> 执行业务代码 -> 事务提交 -> 解锁

	private final Lock lock = new ReentrantLock(true);
	
	
	public void perform() {
    
    
		try {
    
    
			lock.lock();
			// 调用 修改方法
			update();
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}finally{
    
    
			lock.unlock();
		}
	}
	
	@Transactional(rollbackFor = Exception.class)
	public void update() {
    
    
		try {
    
    
			// 业务代码
		} catch (Exception e) {
    
    
			// 抛出异常,不然 事物回滚会失效
			throw new RuntimeException("操作异常");
		}
	}

第二种

比较少,有遇见过, 在spring管理的类.方法里面创建 lock实例,导致 每访问这个方法 都会创建一个锁, 创建的这个锁只属于当前这个方法,相当于 100百个人访问这个方法,就会创建100个锁,违背了锁的意义了,应该是 100个人 访问 只能有一个人获取到锁

错误代码示例

@Service
public class TestService{
    
    

	public void update(){
    
    
		ReentrantLock lock = new ReentrantLock(true);
		try {
    
    
			lock.lock();
			// 业务代码
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}finally{
    
    
			lock.unlock();
		}
		
		
	}
}

修改 代码示例

@Service
public class TestService{
    
    

	private final ReentrantLock lock = new ReentrantLock(true);
	
	public void update(){
    
    
		try {
    
    
			lock.lock();
			// 业务代码
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}finally{
    
    
			lock.unlock();
		}
		
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40739917/article/details/126135398