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

如何在JavaEE应用程序中锁定数据库记录?,java,jakarta-ee,jpa,transactions,Java,Jakarta Ee,Jpa,Transactions,我想编写一个JavaEEWeb应用程序,让不同的用户使用一个数据库。用户可以开始编辑记录,然后保存更改或取消编辑。用户编辑时,应为其他用户锁定记录。它应该在数据库级别锁定,因为还有其他非Java用户编辑同一数据库,锁定他们处理的记录 我了解一些基本的Java+数据库,但我不擅长多用户操作,比如锁定。在互联网上寻找一些例子,在我看来,每一个JavaEE技术的“HelloWorld”例子都至少引入了另一种技术。为了访问数据库中的对象,我使用JPA。要锁定记录,我可能需要事务,这会带来JTA。为了与J

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

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

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

  • 使用JPA

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

  • 具有一个
    MyObject
    类,其属性为
    id
    name
    ,存储在
    MyObject
    表中

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

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

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


(另一个细节:描述了EntityTransaction和UserTransaction之间的区别。如果我理解正确,仅当我使用多个数据库时才需要JTA。如果我仅使用一个具有不同模式的Oracle数据库,是否也需要JTA?如果是,请使用JTA编写示例代码。)

我们不会为您解决此问题。你什么都要。您需要自己编写代码,但这里有一个JPA锁定链接

提示:使用
@Version


请阅读此处,了解有关

的信息,我们不会为您解决此问题。你什么都要。您需要自己编写代码,但这里有一个JPA锁定链接

提示:使用
@Version

阅读此处,了解有关

1)的信息如果要锁定数据库中的记录,则需要一种名为悲观锁的方法。记住这个关键词,并使用它进行进一步的谷歌搜索。简单地说,悲观锁意味着真正锁定数据库中的记录。这意味着,如果您的Java应用程序进行了悲观锁定,则记录实际上被锁定;因此,即使其他非Java程序访问同一个数据库,记录也会被锁定,并且无法修改

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

2) JPA是一种统一的方法,用于使用带有事务和内容的数据库,它还为您将对象映射到表。这可能是你想要的

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

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

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

1)如果要锁定数据库中的记录,则需要名为悲观锁的东西。记住这个关键词,并使用它进行进一步的谷歌搜索。简单地说,悲观锁意味着真正锁定数据库中的记录。这意味着,如果您的Java应用程序使悲观者