当前位置: 首页 > 知识库问答 >
问题:

如何在Java EE应用程序中锁定数据库记录?

符风畔
2023-03-14

我想编写一个 Java EE Web 应用程序,其中不同的用户使用数据库。用户可以开始编辑记录,然后保存更改或取消编辑。当用户进行编辑时,应为其他用户锁定记录。它应该在数据库级别锁定,因为还有其他非Java用户在编辑同一数据库,锁定他们处理的记录。

我了解一些基本的Java数据库,但我不擅长多用户的事情,比如锁定。在互联网上寻找一些例子,在我看来,JavaEE技术的每个“hello world”例子都至少介绍了一种其他技术。为了访问数据库中的对象,我使用JPA。为了锁定记录,我可能需要事务,这就带来了JTA。为了使用JTA,我需要JNDI。为了使用所有这些对象,我可能还需要EJB和注入……此时此刻,我想知道这是否真的是解决问题的最简单方法,或者我是否错过了一些重要的东西。我不知道是否所有这些技术都是必要的(如果是的话,我会使用它们;我只是想在我全部学习之前确定一下)。我只是看到我在网上找到的例子非常慷慨地介绍了它们。

我想要一个简单的Java EE代码示例:

>

  • 使用JPA;

    连接到“persistence.xml”文件中描述的数据库;

    有一个<code>MyObject

    有一个方法(例如从JSP页面调用),该方法在数据库级锁定id=42的对象(因此访问同一数据库的非Java用户也无法修改它),或者如果记录已经被另一个用户(另一个Java用户或非Java用户)锁定,则显示错误;

    具有另一种方法(例如,从另一个 JSP 调用),该方法要么将名称更新为指定值并释放锁,要么仅在提供空字符串时释放锁。

    对于您在解决方案中引入的每项新技术,我都希望听到一个非常简短的解释,为什么使用它。此外,该技术是否要求我安装新库,创建或修改配置文件,编写其他代码等(调用方法的JSP文件不是必需的;我对数据库相关的部分感兴趣。

    (另一个细节:下面描述了实体事务和用户事务之间的区别。如果我理解正确,则仅当我使用多个数据库时才需要 JTA。如果我只使用一个具有不同架构的 Oracle 数据库,是否也有必要这样做?如果是,请使用 JTA 编写示例代码。

  • 共有2个答案

    蒋曾笑
    2023-03-14

    我们不会为你解决这个问题。你要求一切。你需要自己编码,但是这里有一个JPA锁定的链接。

    提示:使用< code>@Version

    有关 JPA 锁定的信息,请阅读此处

    谭景福
    2023-03-14

    1)如果你想锁定数据库中的一条记录,你需要一种叫做悲观锁的东西。记住这个关键词,用它来进一步搜索。简单地说,悲观锁意味着真正锁定数据库中的记录。这意味着如果您的Java应用程序进行悲观锁定,记录就真的被锁定了;因此,即使其他一些非Java程序访问同一个数据库,记录也会被锁定,他们不能修改它。

    另一方面,所谓的乐观锁主要是一种假装锁。这大概是一种“我们很可能不需要锁定这个记录,所以我们不会真的锁定它,如果发生了不好的事情,那么我们会尝试在事后修复这个问题”的方法。这实际上是有意义的,并且提高了性能,但是只有在这种方法背后的假设为真的情况下;冲突很少发生的地方,你真的可以事后解决问题的地方。除非你很好地理解它(你似乎没有),否则不要使用它。

    2) JPA是使用数据库进行事务处理的统一方法,它还为您将对象映射到表。这大概就是你想要的吧。

    JTA是相同的东西,加上在许多数据库上使用事务的统一方法,因此它比JPA更强大,但这意味着它具有您并不真正需要的附加功能。另一方面,为了使用这些超能力,你付出了一些代价,比如失去了启动和交易的能力。服务器将根据需要为您管理事务。如果你完全理解它的工作原理,那么你就知道它是否符合你的需要;但如果你不这样做,那么你宁愿避免它。您的开发环境可能会为您提供JTA作为默认选项,但这只是因为它认为您将编写Skynet。通过不使用JTA,您也不必使用JNDI、EJB和许多其他天网相关技术。

    3)听到这里,现在是你做作业的时候了。因为现在你知道该怎么做了。阅读“javax . persistence”API文档。

    您可以使用带注释的Java类来表示数据库表;或者您可以使用老式的SQL查询;或者两者都可以。您可以使用它们中的任何一个来锁定和释放记录。锁必须位于事务内部,因此如果您想保留锁,就必须保留事务。

     类似资料:
    • 我试图用JPA和Oracle DB创建一个多用户JavaEE应用程序。在我以前的应用程序中,我使用了ReentrantReadWriteLock Java类来锁定数据源。现在我看到JPA支持乐观和悲观锁定,Oracle根据隔离级别自动锁定资源。< br >所以我想知道锁定的最佳方式是什么?在java中用ReentrantReadWriteLock,用JPA还是直接在数据库中?我甚至需要在java中

    • 我是Java的新学习者,目前很难理解库和main的概念。我试图将用户的输入存储在特定的库中,即Store,而不添加“静态”。我的逻辑错了吗?这是我的代码 这是我的库代码

    • 问题内容: 我已经创建了一个SQLite数据库。我想将此数据库文件用于我的Android项目。我想将此数据库与我的应用程序捆绑在一起。 应用程序如何创建该数据库的访问权限并将其用作数据库,而不是创建新数据库? 问题答案: 注意: 在尝试此代码之前,请在以下代码中找到此行: 此处是你的数据库的名称。假设你在文件夹中有数据库的副本,因此,例如,如果你的数据库名称为,则的值为, 将数据库保留在资产文件夹

    • 问题内容: 我有一个SQL Server 2008数据库和一个asp.net前端。 当用户当前正在编辑记录但不确定哪种是最好的方法时,我想实现一个锁定。 我的想法是为记录创建一列,并在用户拉出该记录时将其设置为true,这意味着所有其他用户都具有只读访问权限,直到第一个用户完成编辑为止。 但是,如果会话超时并且他/她从不保存/更新记录,该记录将保留为,表示其他人无法对其进行编辑,对吗? 如何实现某

    • 我目前正在android studio中开发一个应用程序,因为我正试图在业余时间学习如何使用它,我的知识非常有限,所以我希望我能解释我的应用程序的概念,并向人们提供一些我可以使用的不同技术的建议。我的应用程序的基本思想是,它允许人们搜索名人,并显示他们的一些事实,他们的出生日期等。我知道它没有什么特别的,但它实际上是一个概念,可以帮助我提高我的android studio知识。 我的主要问题是以一

    • 我们正在使用Spring启动,apache骆驼和多个数据源。 我们已经在linux服务器上部署了SpringBootJAR。 postgres的数据源属性为 Oracle的数据源属性 当应用程序保持理想状态时,经过一段时间后,我们尝试第一个请求失败,并得到错误jdbc连接失败,但它在第二个请求中工作,没有重新启动。 请让我知道如何保持数据库活动。