如何锁定表...做事...使用 Spring Boot 解锁表?

2024-04-04

这个想法基本上是扩展some具有自定义功能的存储库。所以我得到了这个设置,它确实有效!

@MappedSuperclass
abstract class MyBaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int = 0

    var eid: Int = 0

}

interface MyRepository<T : MyBaseEntity> {

    @Transactional
    fun saveInsert(entity: T): Optional<T>
}

open class MyRepositoryImpl<T : MyBaseEntity> : MyRepository<T> {

    @Autowired
    private lateinit var entityManager: EntityManager

    @Transactional
    override fun saveInsert(entity: T): Optional<T> {

        // lock table
        entityManager.createNativeQuery("LOCK TABLE myTable WRITE").executeUpdate()

        // get current max EID
        val result = entityManager.createNativeQuery("SELECT MAX(eid) FROM myTable LIMIT 1").singleResult as? Int ?: 0

        // set entities EID with incremented result
        entity.eid = result + 1

        // test if table is locked. sending manually 2-3 POST requests to REST
        Thread.sleep(5000)

        // save
        entityManager.persist(entity)

        // unlock
        entityManager.createNativeQuery("UNLOCK TABLES").executeUpdate()

        return Optional.of(entity)
    }
}

我怎样才能做得更像春天呢?

起初,我以为@Transactional会做锁定和解锁的事情。我尝试了几个附加参数@Lock。我确实阅读了文档和一些教程,但抽象的技术英语通常不容易理解。最后,我没有得到有效的解决方案,所以我手动添加了表锁定,效果很好。仍然更喜欢一种更像弹簧的方式来做到这一点。


1)您当前的设计也可能存在问题。这persist不会立即在数据库中插入一行。当方法返回时,这会在事务提交时发生。

因此,您可以在实际插入之前解锁表:

    // save
    entityManager.persist(entity) // -> There is no INSERT at this point.

    // unlock
    entityManager.createNativeQuery("UNLOCK TABLES").executeUpdate()

2)回到如何仅使用 JPA 而不使用本机来执行此操作(它仍然需要一些解决方法,因为默认情况下不支持它):

    // lock table by loading one existing entity and setting the LockModeType
    Entity lockedEntity = entityManager.find(Entity.class, 1, LockModeType.PESSIMISTIC_WRITE);

    // get current max EID, TRY NOT TO USE NATIVE QUERY HERE

    // set entities EID with incremented result

    // save
    entityManager.persist(entity)
    entityManager.flush() // -> Force an actual INSERT

    // unlock by passing the previous entity
    entityManager.lock(lockedEntity, LockModeType.NONE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何锁定表...做事...使用 Spring Boot 解锁表? 的相关文章

随机推荐

  • C# 服务器和 Java 客户端:TCP 套接字通信问题

    我用 C 编写了一个服务器程序TCPListner和一个使用套接字的 Java 客户端程序 但我无法将复杂的对象从 Java 客户端发送到 C 服务器 当我通过将字符串转换为字节数组从 Java 客户端发送到 C 服务器时 当转换回字符串时
  • Ansible设置mysql root密码

    你们中有人有想法构建一个 yml 用于 mysql 更新 root 密码并授予权限吗 我已经创建了我的剧本 并且在全新安装时它按预期工作 完全没有问题 但是 当我再次进行 vagrant 配置时 它现在无法设置 root 密码 并且出现错误
  • 按排序顺序将元素插入数组

    我正在尝试按排序顺序将元素添加到数组中 这是我的代码 public class SortedInsertion public static void main String args int arr new int 6 arr 0 5 ar
  • LINQ如何返回最后一个日期以及第一个和最后一个计数之间的差异

    我有一个包含以下列和示例数据的表 acteename updated at count count is not sorted in db dev 52 2 7 2020 5 56 43 PM 1 dev 52 2 7 2020 5 56
  • 根据 Woocommerce 中的特定产品数量渐进式固定优惠券折扣

    我有一个小问题 不知道如何解决自己 我想在我的 Woocommerce 商店中仅针对一种产品使用此逻辑 我使用这样的链接来自动应用优惠券代码并添加到购物车 https testsite com checkout add to cart Pr
  • Videojs仅添加播放控件

    我在用Video js在我的网页中播放视频 我想将播放器控件自定义为仅播放按钮 我的代码是
  • 如何构建/编译 ndk 应用程序?

    嗨 现在我正在下载 ndk 但我不知道如何构建和编译 实际上我是 Android 应用程序的新手 现在我正在使用 linux 并且我不太擅长命令行 embdes embdes laptop cd home embdes projects a
  • 如何从简单的 jsdom 函数返回值?

    我将 jsdom 与 jquery 一起使用 并且运行得很好 然而 我试图将我的代码模块化一点 这样我就不会重复自己 所以我用一些 jsdom 代码创建了一个基本函数 它接受一些 html DOM 用 jquery 调整它 然后将其吐出来
  • AngularJS:避免在收到响应之前两次调用相同的 REST 服务

    我有两个指令 每个指令都使用包装 q http 调用的同一工厂 angular module demo directive itemA restService function restService return restrict A l
  • 张量流中的批量归一化

    我注意到张量流的 api 中已经有批量归一化函数 但我不明白的一件事是如何更改训练和测试之间的程序 批量归一化在测试期间的行为与训练期间的行为不同 具体来说 在训练期间使用固定的均值和方差 某处有一些好的示例代码吗 我看到了一些 但是对于作
  • 在 PHPUnit 中进行模拟时,通过回调中的引用传递

    我有一个想要模拟的接口 并模拟其方法之一的行为 所以我创建了一个回调来非常简单地模拟行为 如果我创建一个基于此接口的新对象 但我想模拟该接口 则此测试通过 模拟的 setUp 方法被正常调用 并且在回调中调用 getVar testing
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • PHP 日期时间大于今天

    请帮忙我的代码有什么问题吗 它始终返回今天的日期大于 01 02 2016 其中 2016 年大于 2015 年
  • 无法使用 [formControlName] 禁用 matInput 元素

    我在用着matInput and mat form field angular material 在 Angular 组件中 我无法禁用matInput 可以在这里看到一个工作示例 https stackblitz com edit ang
  • SSL 握手挂起

    我在论坛上看到过这个问题 但找不到任何合适的解决方案 此外 所有这些问题都缺少一些信息 所以我想把我学到的所有东西放在这里 连接点 我正在使用 SSL TLSopenfire具有2路身份验证 获得自签名通配符证书 这意味着我在客户端和服务器
  • startMonitoringForRegion并不总是将区域添加到monitoringRegions

    我无法让 startMonitoringForRegion 持续添加区域 int i 0 for Deals d in deals NSLog deal addRegionsInDealsArray d deal id if d latit
  • 在托管 ASP 站点的 URL 中附加 www(即无 IIS 访问权限)

    我看到很多类似的问题都是用乱码写的 我不明白 使用 htaccess 将非 www URL 重定向到 www https stackoverflow com q 50931 153923 将不带 www 的 URL 重定向到 www htt
  • jQuery 从 DOM 中删除元素仍将报告保留为当前状态

    我有一个地址查找系统 用户输入邮政编码 如果邮政编码经过验证 则返回并显示地址列表 然后他们选择一个地址行 该列表消失 然后地址行进一步分成一些表单输入 我面临的问题是 当他们完成上述过程 然后清除邮政编码表单字段 点击查找地址按钮 地址列
  • 抛出异常时如何显示堆栈跟踪

    我希望有一种方法可以在引发异常时向用户报告堆栈跟踪 做这个的最好方式是什么 如果可能的话 我希望它是便携式的 我希望弹出信息 以便用户可以复制堆栈跟踪并在出现错误时通过电子邮件发送给我 安德鲁 格兰特的回答 https stackoverf
  • 如何锁定表...做事...使用 Spring Boot 解锁表?

    这个想法基本上是扩展some具有自定义功能的存储库 所以我得到了这个设置 它确实有效 MappedSuperclass abstract class MyBaseEntity Id GeneratedValue strategy Gener