Spring @Transactional 和 Spring @Lock 注解有啥关系?

Posted

技术标签:

【中文标题】Spring @Transactional 和 Spring @Lock 注解有啥关系?【英文标题】:What is the relation between Spring @Transactional and Spring @Lock annotation?Spring @Transactional 和 Spring @Lock 注解有什么关系? 【发布时间】:2020-03-06 05:53:22 【问题描述】:

我发现@Transactional 用于确保存储库方法或服务方法上的事务。@Lock 用于存储库方法以确保实体锁定以提供隔离。

我的脑海中提出了一些问题:

    这两个注释的主要区别/关系是什么? 何时使用@Transactional,何时使用@Lock@Lock 在分布式数据库系统中是否有用以提供数据并发和一致性?

【问题讨论】:

@Lock 是 Spring Data (JPA) 注释,而不是像 @Transactional 这样的 Spring 注释。 【参考方案1】:

事务性: 每当您添加@Transactional 注释时,它都会启用符合ACID 属性的事务性行为

ACID: ACID(原子性一致性隔离持久性)是一组 旨在保证有效性的数据库事务的属性 即使发生错误。

原子 保证事务中的所有操作都被视为一个“单元”,要么完全成功,要么完全失败。

一致 通过防止数据损坏,确保事务只能将数据库从一种有效状态带入另一种有效状态。

隔离 确定一个事务所做的更改如何以及何时对另一个事务可见。从严格性的角度来看,Serializable 和 Snapshot Isolation 是前 2 个隔离级别。

耐用 确保交易结果永久存储在系统中。即使在断电或系统故障的情况下,修改也必须保持不变。


Lock:不应与事务性混淆,@Lock 在事务

期间启用锁定行为

JPA 定义了两种主要的锁类型。

    悲观锁定 乐观锁定

如果你想了解更多关于悲观锁和悲观锁的知识,你可以上网浏览一下,下面是Baeldung的解释,

悲观锁定 交易并访问一个实体,它将立即被锁定。这 事务通过提交或回滚来释放锁 交易。

乐观锁定 在乐观锁定中,事务不锁定 该实体立即。相反,事务通常保存 实体的状态以及分配给它的版本号。

当我们尝试在不同的事务中更新实体的状态时, 事务将保存的版本号与现有的版本号进行比较 更新期间的版本号。

此时,如果版本号不同,则表示实体 无法修改。如果有一个活跃的交易,那么 事务将被回滚并且底层的 JPA 实现 将抛出 OptimisticLockException。

除了版本号的方式,我们还可以使用其他方式 例如时间戳、哈希值计算或序列化校验和, 取决于哪种方法最适合我们当前的 开发环境。

spring 中还有其他可用的锁类型

NONE:没有锁定。 OPTIMISTIC:乐观锁。 OPTIMISTIC_FORCE_INCREMENT:乐观锁,有版本更新。 PESSIMISTIC_FORCE_INCREMENT:悲观写锁,有版本更新 PESSIMISTIC_READ:悲观读锁。 PESSIMISTIC_WRITE:悲观写锁。 阅读: 与 OPTISISTIC 同义。 WRITE: 与 OPTIMISTIC_FORCE_INCREMENT 同义。

现在回答你的问题

    这两个注释的主要区别/关系是什么?

看完上面你就明白了

    何时使用@Transactional,何时使用@Lock?

如果您想要事务行为,请添加@transactional,如果您的用例需要锁定,并且根据用例使用适当的锁定

    @Lock 在分布式数据库系统中是否有用以提供数据 并发性和一致性?

我们用来处理并发的两个主要工具是数据库事务和分布式锁。这两者不可互换。需要锁时不能使用事务。需要事务时不能使用锁。 source

【讨论】:

你能说得更具体一点吗...我的意思是交易失败的常见情况是什么?事务内部是否使用任何锁定系统? 是的,事务锁定是为了保护资源并确保 ACID,隔离在这里也起作用,最后提交的事务获胜,默认连接的隔离级别是 READ COMMITTED,它可以防止脏读 您可以在tutorialspoint.com/dbms/dbms_concurrency_control.htm阅读更多关于事务期间锁定的信息 你们可以看看这个帖子并帮助我吗?我正在尝试根据这篇文章实施但没有成功:***.com/questions/68351144/…

以上是关于Spring @Transactional 和 Spring @Lock 注解有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

spring 和@transactional,这正常吗?

Spring @Transactional 合并和持久化问题

Spring @Transactional 和 @Async

Spring @Transactional 和 JDBC 自动提交

Spring @Transactional 使用

Spring Boot 和 Spring Data JPA @Transactional 不工作