第一种
比较多的, 事物没提交,下一个线程获取到的还是 上一个线程 未提交的数据
错误代码示例
这段代码执行顺序是
开启事务 -> 获取锁 -> 执行业务代码 -> 解锁 -> 事务提交
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();
}
}
}