java spring 数据库_java – 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 {

@Lock(LockModeType.PESSIMISTIC_WRITE)

Parent findOne(Long id);

}

会做的.

您应该注意的一件事是,如果同时调用此操作太多次,您将遇到超时并且可能也会出现死锁,因为行被排他性地锁定.您将受益于以下内容:

>保持锁定的时间非常短,可能是在处理的最后阶段,确保预先执行任何验证等.这将确保快速释放锁.>使用并发用户进行测试,并了解超时和死锁可能发生的频率.如果您看到超时和死锁并且不希望用户重试,您可以使用Spring Retry项目提供的功能来重试方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值