Boh*_*nko 5 spring hibernate jpa locking spring-data-jpa
我需要一些悲观实体锁定方面的帮助。我在我的应用程序中使用 PostgreSQL 和 Spring 数据 JPA(引擎盖下的 hibernate 5)。所以,我想展示一个我面临的任务。
我有一些有钱的用户帐户:
@lombok.Data //Used to generate getters and setters
@Entity
class AccountEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Long balance;
}
Run Code Online (Sandbox Code Playgroud)
和付款,允许将钱从一个帐户转移到另一个帐户
@lombok.Data
@Entity
class PaymentEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Long amount;
@OneToOne
@JoinColumn(name="account_from_id")
private AccountEntity accountFrom;
@OneToOne
@JoinColumn(name="account_to_id")
private AccountEntity accountTo;
}
Run Code Online (Sandbox Code Playgroud)
两者的存储库:
interface AccountRepository extends JpaRepository<AccountEntity, Integer> {}
interface PaymentRepository extends JpaRepository<PaymentEntity, Integer> {}
Run Code Online (Sandbox Code Playgroud)
以及进行汇款的服务:
interface PaymentService {
PaymentEntity create(PaymentEntity paymentEntity);
}
@Service
class PaymentServiceImpl implements PaymentService {
@Autowired
private AccountRepository accountRepository;
@Autowired
private PaymentRepository paymentRepository;
@Transactional
@Override
public PaymentEntity create(PaymentEntity payment) {
AccountEntity from = accountRepository.getOne(payment.getAccountFrom().getId()); //want to lock account here
AccountEntity to = accountRepository.getOne(payment.getAccountTo().getId()); //want to lock account here
Long newFromBalance = from.getBalance() - payment.getAmount();
Long newToBalance = to.getBalance() + payment.getAmount();
if (newFromBalance < 0)
throw new RuntimeException("Not enough money for payment");
from.setBalance(newFromBalance);
to.setBalance(newToBalance);
PaymentEntity result = paymentRepository.save(payment); //create payment
accountRepository.save(from); //update account
accountRepository.save(to); //update account
return result; //want to unlock both accounts here
}
}
Run Code Online (Sandbox Code Playgroud)
所以,正如你从代码中看到的,我想锁定两个账户,在交易开始时涉及到汇款(这将保证在交易提交之前它们都不能被更改,并且每次新的付款都会获取更新的账户余额)。在交易结束时,我想同时解锁它们。
我已经阅读了文档,正如我和我所理解的那样,为此我需要更新我的AccountRepository:
interface AccountRepository extends JpaRepository<AccountEntity, Integer> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
AccountEntity save(AccountEntity account);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码必须在交易开始时锁定from和to帐户,并在交易结束时自动解锁。但我还有一些疑问:
@Lock(LockModeType.PESSIMISTIC_WRITE)只能应用于存储库方法(不适用于服务方法)。不是吗?@Lock将锁定在一个事务中(所有实体,进行了哪些选择from和to在我的情况帐户)。不是吗?如果您提供官方文档或某些站点的链接,我将非常感谢,我可以在那里自己发现这个主题。
| 归档时间: |
|
| 查看次数: |
3369 次 |
| 最近记录: |