Java Spring@Transactional和Spring@Lock注释之间的关系是什么?

Java Spring@Transactional和Spring@Lock注释之间的关系是什么?,java,spring,java-annotations,Java,Spring,Java Annotations,我发现@Transactional用于确保存储库方法或服务方法上的事务。 @Lock用于存储库方法,以确保实体锁定以提供隔离 我想到了一些问题: 这两种注释的主要区别/关系是什么 何时使用@Transactional以及何时使用@Lock @Lock在分布式数据库系统中提供数据并发性和一致性是否有用 事务性:无论何时放置@Transactional annotation,它都会启用符合ACID属性的事务性行为 酸:酸(原子性,稠度,隔离性,耐久性)是一组 用于保证有效性的数据库事务的属性 即使在

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

我想到了一些问题:

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

  • 事务性:无论何时放置@Transactional annotation,它都会启用符合ACID属性的事务性行为

    酸:酸(原子性稠度隔离性耐久性)是一组 用于保证有效性的数据库事务的属性 即使在发生错误的情况下

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

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

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

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


    锁定:不应与事务性锁定混淆,@Lock在事务期间启用锁定行为

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

  • 悲观锁
  • 乐观锁
  • 如果你想了解更多关于悲观和贪得无厌锁定的信息,你可以浏览互联网,以下是

    悲观锁定当我们在 事务和访问实体时,它将立即被锁定。这个 事务通过提交或回滚 交易

    乐观锁定在乐观锁定中,事务不锁定 该实体立即被删除。相反,事务通常会保存 实体的状态,并为其指定了版本号

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

    此时,如果版本号不同,则表示实体 不能修改。如果存在活动事务,则 事务将回滚,并且底层JPA实现 将抛出乐观锁异常

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

    spring中还提供了其他锁类型

    • 无:无锁
    • 乐观:乐观锁定
    • 乐观\u力\u增量:乐观锁定,版本更新
    • 悲观强制增量:悲观写锁,版本更新
    • 悲观读取:悲观读取锁定
    • 悲观写入:悲观写入锁定
    • 阅读:乐观的同义词
    • 写:与乐观的力量增量同义

    现在回答你的问题

  • 这两种注释的主要区别/关系是什么
  • 阅读上述内容后,您就会明白

  • 何时使用@Transactional,何时使用@Lock
  • 如果您想要事务性行为,则添加@transactional,如果您的用例需要锁定,并根据用例使用适当的锁定

  • @Lock在分布式数据库系统中提供数据有用吗 并发性和一致性

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

    您能更具体一点吗。。。我的意思是a交易失败的通常情况是什么?事务内部是否使用任何锁定系统?是的,事务锁定用于保护资源并确保ACID,隔离在这里也起作用,最后提交的事务获胜,默认情况下连接的隔离级别为READ committed,它可以防止脏读。您可以在
    @Lock
    上阅读有关事务期间锁定的更多信息,它是一个Spring数据(JPA)注释,而不是像
    @Transactional
    那样的Spring annation。