JPA事务管理

首先先来了解一下事务的相关知识:

事务 (Transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit)。在关系数据库中,一个事务可以是一条或一组 SQL 语句,甚至整个程序。它有通常被称为 ACID 的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)四大特性:

原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(Durability):持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影

EJB 中针对不同的的情况提供了下面六种不同的事物传播属性:

Required:用该属性标注的方法或组件总是在事务中运行。如果客户端已经在事务中,则在原事务中运行;如果没有事务,则开启一个新事务,在其中运行。

Requires_New:方法或组件总是在新开启的事务中运行。如果客户端已经在事务中,则首先将原事务挂起,然后新开启一个事务,在其中运行,新事务结束之后,原来事务从挂起点继续执行;如果没有事务,则开启一个新事务,在其中运行。

Supports:和 Required 属性的不同点是,在没有事务的环境中不会开启一个新事务;如果存在事务的话则加入其中运行,这点和 Reuqired 相同。

Not_Supported:如果事务已经存在的情况下,则原来的事务要挂起,然后调用标注该属性的方法或组件,调用结束之后,继续原来的事务;无事务环境中调用的时候,不开启新事务,这点和 Supports 相同。

Mandatory:调用标注该属性的方法或组件的客户端,必须已经在事务中,如果不在事务中则会抛出异常;如果已经在事务中,则加入原来事务运行。和 Required 不同的是,该属性不会自动开启新的事务;

Never用 Never 属性标注的方法或组件,不能在事务中运行。如果调用该方法或组件的客户端已经在事务中,则抛出异常。

了解了事务的相关知识后,下面补充几个知识点


1、不是所有例外都会导致事务回滚,EJBException可以回滚事务

2、事务是否回滚由调用的最外层函数决定

3、同一个类中注解的优先级别。
   函数事务的优先级高于类的优先级(当且仅当函数没有被显示注解事务类型时,类的事务类型才起作用);如果存在多个函数调用关系,以调用函数的事务为准,被调用函数的事务不起作用。

4、不同类之间注释的优先级别。
   不同类之间的调用,事务互不影响。


你可能感兴趣的:(JPA事务管理)