java – Spring中的数据库写锁实体
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring中的数据库写锁实体,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1784字,纯文字阅读大概需要3分钟。
内容图文
![java – Spring中的数据库写锁实体](/upload/InfoBanner/zyjiaocheng/901/59f4ace4abda4c1ea4b52c1ff84be2a2.jpg)
当我正在使用他的子实体时,我需要对父实体进行写锁定,以便不允许修改(或者稀疏)父实体.
我需要使用Spring并直接从数据库执行锁定(以避免在集群中执行应用程序时出现问题).
解决方法:
为了实现您正在寻找的策略,您需要在父行上触发SELECT FOR UPDATE SQL查询(例如,SELECT * FROM parent WHERE id =?FOR UPDATE.这将获取对所提取的行的锁定SELECT查询.
General strategy
>开始交易.
>使用SELECT FOR UPDATE加载父行.
>更新孩子.
>拯救孩子.
>提交交易.这将保存子项并释放父行上的锁.
您可以使用Spring Transactions来强制执行事务边界.以下内容将起作用:
class SomeService {
@Transactional
public ... someMethod(...) {
// Load the parent row using SELECT FOR UPDATE.
// Save children.
}
}
@Transactional将围绕对someMethod的调用应用事务语义.请注意,该方法必须公开才能使@Transactional正常工作.
执行SELECT FOR UPDATE取决于您访问数据库的准确程度 – Spring JDBC,Spring ORM,Spring Data JPA等.以下是使用这些库实现此目的的方法:
Spring JDBC
您可以使用JdbcTemplate类简单地执行SELECT FOR UPDATE查询. jdbcTemplate.execute(“SELECT * FROM parent WHERE row =?FOR UPDATE”)应该有效.
Spring ORM
您必须使用特定于ORM的模板类来强制执行锁定模式.例如,使用Hibernate4 HibernateTemplate,您可以使用hibernateTemplate.get(Class< T> entityType,Serializable id,LockMode lock).
Spring Data JPA
您可以使用@Lock(LockModeType.PESSIMISTIC_WRITE)注释存储库方法,以在执行查询时强制执行悲观锁定.例如
interface ParentRepository extends CrudRepository<Parent, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Parent findOne(Long id);
}
会做的.
您应该注意的一件事是,如果同时调用此操作太多次,您将遇到超时并且可能也会出现死锁,因为行被排他性地锁定.您将受益于以下内容:
>保持锁定的时间非常短,可能是在处理的最后阶段,确保预先执行任何验证等.这将确保快速释放锁.
>使用并发用户进行测试,并了解超时和死锁可能发生的频率.如果您看到超时和死锁并且不希望用户重试,您可以使用Spring Retry项目提供的功能来重试方法.
内容总结
以上是互联网集市为您收集整理的java – Spring中的数据库写锁实体全部内容,希望文章能够帮你解决java – Spring中的数据库写锁实体所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。