Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧&x2B;hibernate和@Transactionl注释,它是如何工作的?_Java_Hibernate_Spring_Transactions - Fatal编程技术网

Java 弹簧&x2B;hibernate和@Transactionl注释,它是如何工作的?

Java 弹簧&x2B;hibernate和@Transactionl注释,它是如何工作的?,java,hibernate,spring,transactions,Java,Hibernate,Spring,Transactions,在方法上使用@Transactional与不使用它有什么区别 我写了一些简单的测试,但似乎没有什么不同 我想学习如何使用spring和annotation管理事务 谢谢大家。如果将@Transactional置于方法之上,则访问数据库的每个方法调用(以及其他@Transactional方法中的每个方法调用-取决于您如何设置)都只使用一个数据库连接。这意味着您可以回滚事务中发生的所有更新/插入。如果其中一个更新/插入引发异常,则可以回滚在该异常->数据完整性之前发生的事务中的所有更新/插入 简单地

在方法上使用@Transactional与不使用它有什么区别

我写了一些简单的测试,但似乎没有什么不同

我想学习如何使用spring和annotation管理事务


谢谢大家。

如果将@Transactional置于方法之上,则访问数据库的每个方法调用(以及其他@Transactional方法中的每个方法调用-取决于您如何设置)都只使用一个数据库连接。这意味着您可以回滚事务中发生的所有更新/插入。如果其中一个更新/插入引发异常,则可以回滚在该异常->数据完整性之前发生的事务中的所有更新/插入

简单地说,如果您有一个@Transactional方法,例如使用spring JdbcTemplate来执行一些插入或更新(无论有多少次),那么它们将是事务性的,如果抛出了一些异常或应用了回滚,那么您必须详细阅读文档

如果在多个方法上使用@Transactional(propagation=propagation.REQUIRED),然后调用这些方法,则使用这些方法对数据库进行的所有插入/更新都将是一个大型事务的一部分


重要提示:正如我在评论中提到的,您不能从声明这些方法的同一个类调用它们。原因是,这一切都基于AOP代理调用,只有在实例化DAO对象并调用对象上的@Transactional方法时才会发生。否则它就不起作用了,你可能也不知道为什么

我可以像session.beginTransaction()->myTransactionalMtehod()->transaction.commit()那样考虑@Transactional吗?如果我调用两个连续的方法,使用@transactional,transaction是begin tiwce?你可以这样想,但是是分布式的。如果您选择选项“需要传播”,那么所有@Transactional方法都是一个大事务的一部分……那么该事务可能涵盖来自不同位置的持久性方法。这是一个AOP,在持久化方法执行DB请求之前,它提供了共享数据库连接,因此作为事务一部分的所有方法都从同一对象请求DB,然后就可以提交/回滚。重要的是要知道,您必须从不同的类/对象调用@Transactional方法。它是一个AOP代理,因此您不能从同一个对象调用@Transactional方法,调用不会被代理,也不会有任何事务…只需实例化DAO对象,使用@Transactional方法,在其他地方调用它的方法。。。