Spring事务的传播特性:
1、PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
2、PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3、PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4、PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5、PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
6、PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
7、PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
Spring事务的隔离级别:
1、ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应
2、ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。
3、ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
4、ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
5、ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
数据库操作面临的问题: 脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一 个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。 那么,在第一个事务中的两
1.在外围方法未开启
事务
的情况下Propagation.REQUIRED修饰的内部方法会新开启自己的
事务
,且开启的
事务
相互独立,互不干扰。
2.在外围方法开启
事务
的情况下Propagation.REQUIRED修饰的内部方法会加入到外围方法的
事务
中,所有Propagation.REQUIRED修饰的内部方法和外围方法均属于同一
事务
,只要一个方法回滚,整个
事务
均回滚.抛出异常或者异常捕获到都回滚
3.在外围方法未开启
事务
的情况下Propagation.REQUIRES_NEW修饰的内部方法会新开启自己的
事务
,
事务
传播
行为什么叫
事务
传播
行为?听起来挺高端的,其实很简单。
即然是
传播
,那么至少有两个东西,才可以发生
传播
。单体不存在
传播
这个行为。
事务
传播
行为(propagation behavior)指的就是当一个
事务
方法被另一个
事务
方法调用时,这个
事务
方法应该如何进行。
例如:methodA
事务
方法调用methodB
事务
方法时,methodB是继续在调用者methodA的
事务
中运行呢,还是为自己开启一个
A,B两个方法都有
事务
,在A方法中去调用B方法,此时
事务
方法应该如何进行处理。
比如 A方法里面调用B方法。
情况一:A方法出现异常,A方法需要回滚,那么B方法需不需要回滚呢?
情况二:B方法出现异常,B方法需要回滚,那么A方法需不需要回滚呢?
spring
总共给出了7种
事务
隔离级别
:
1、PROPAGATION_REQUIRED:默认
事务
类型,如果没有,就新建一个
事务
;如果有,就加入当前
事务
。适合绝大多数情况。
解释:方法A中调用方法B,B方法的
事务
传播
设置为PROPAGATION
一、
传播
特性
的产生
在项目开发中,一般将
事务
设置在service层,当调用这个service方法时,这个service保证了所有的操作在同一个
事务
中,所有对数据库的操作要么一起成功,要么一起失败。
如果service方法除了调用DAO,还调用了其他的service方法,如何通过
事务
控制,保证数据的一致,这个时候就需要
事务
的
传播
特性
。
二、
传播
特性
种类
事务
传播
特性
汇总:
required:使用当前的
事务
,如果当前没有
事务
,则创建一个
事务
,子方法是必须运行在一个
事务
中的,如果当前存在
事务
,则加入这个
事务
,成为一个整体。
supports:如果当前有
事务
,则使用
事务
,如果当前没有
事务
,则不使用
事务
mandatory:该
传播
属
性
强制必须存在一个
事务
,如果不存在,则抛出异常
required_new:如果当前有
事务
,则挂起该
事务
,并且自己创建一个新的
事务
给自己使用;如果当前没有
事务
,则同required
not_support:如果当前有
事务
,..
Spring
的
事务
是指对数据库操作进行的一系列ACID(原子
性
、一致
性
、隔离
性
、持久
性
)操作的控制,确保
事务
的正确
性
和完整
性
。
Spring
支持
编程
式
事务
和声明式
事务
两种方式。
在
Spring
中,
事务
传播
机制是指在一个
事务
方法中调用另一个
事务
方法时,如何处理这两个
事务
之间的关系。
Spring
中定义了7种
事务
传播
行为,分别是:
1. PROPAGATION_REQUIRED:如果当前存在
事务
,则加入该
事务
;否则新建一个
事务
,并在该
事务
中执行。
2. PROPAGATION_SUPPORTS:如果当前存在
事务
,则加入该
事务
;否则以非
事务
方式执行。
3. PROPAGATION_MANDATORY:如果当前存在
事务
,则加入该
事务
;否则抛出异常。
4. PROPAGATION_REQUIRES_NEW:新建一个
事务
,并在该
事务
中执行;如果当前存在
事务
,则挂起当前
事务
。
5. PROPAGATION_NOT_SUPPORTED:以非
事务
方式执行;如果当前存在
事务
,则挂起当前
事务
。
6. PROPAGATION_NEVER:以非
事务
方式执行;如果当前存在
事务
,则抛出异常。
7. PROPAGATION_NESTED:如果当前存在
事务
,则在嵌套
事务
中执行;否则新建一个
事务
,并在该
事务
中执行。
在使用
Spring
事务
时,我们需要根据具体情况选择合适的
事务
传播
行为,以确保
事务
的正确
性
和完整
性
。