spring事务

本文介绍了Spring事务管理的核心概念,包括事务的四大特性:原子性、一致性、隔离性和持久性。详细讲解了Spring提供的PlatformTransactionManager、TransactionDefinition和TransactionStatus接口,并讨论了事务隔离级别、传播行为、超时设置和只读事务。最后,提到了Spring支持的编程式和声明式事务管理方式,强调了声明式事务在实际开发中的广泛应用。
摘要由CSDN通过智能技术生成

目录

概述

事务的特性

spring事务管理提供了一组接口

PlatformTransactionManager平台事务管理器(接口)

TransactionDefinition事务定义信息(隔离、传播行为,超时,只读)


 

概述

逻辑上的一组操作,要么全部成功要么全部失败

实例:银行转账 +100 -100 

事务的特性

原子性,事务不可分割的单位,事务中的操作要么都发生要么都不发生。物理中原子是最小的单位
一致性,事务执行前后数据保持一致性,100 -100
隔离性,多个事务并发,互不干扰,设置隔离级别
持久性,一个事务一旦被提交,他对数据库的改变是永久的

spring事务管理提供了一组接口

spring事务管理高层抽象主要包括三个接口
PlatformTransactionManager
事务管理器(提交、回滚)DataSourceTransactionManager,HibernateTrasactionManager
TransactionDefinition
事务定义信息(隔离、传播行为,超时,只读)
TransactionStatus
事务具体运行状态(是不是已经提交了,是否有保存点,是你不是新的事务)

接口是有联系的,在进行事务管理时会根据事务定义,做出一定操作,产生一定状态

PlatformTransactionManager平台事务管理器(接口)

spring为不同的持久化框架提供了不同的事务管理器,下面是具体实现类

事务说明
org.springframework.jdbc.datasource.DataSourceTransactionManager

使用Spring JDBC  或 Mybatis 等基于DataSource数据源的持久化技术时,

使用 该事务管理器

org.springframework.orm.hibernate3.HibernateTransactionManager使用Hibernate X.0(X 可以为3 4 5)版本进行持久化时,使用该事务管理器
org.springframework.orm.jdo.JdoTransactionManager使用JDO进行持久化时 ,使用该事务管理器
org.springframework.transaction.jta.JtaTransactionManager使用JPA进行持久化时,使用该事务管理器
org.springframework.transaction.jta.JtaTransactionManager具有多个数据源的全局事务使用该事务管理器(不管采用何种持久化技术)

 

 

 

 

 

 

 

TransactionDefinition事务定义信息(隔离、传播行为,超时,只读)

事务隔离性:多个事务并发,互不干扰。

如果不考虑事务隔离性会引发安全问题:

脏读(一个事务读取到另一个事务还没提交的数据,如果这些数据被回滚会导致读到的数据是无效的)、不可重复读(在同一事务中,多次读取另一个事务已经更新提交的数据,会导致本事务同一数据返回结果有所不同)、幻读(一个事务读取另一个事务记录几行记录后,另一个事务insert了新的数据,导致读取该事务的事务会读到原来没有的)

 

事务隔离级别

隔离级别含义
DEFAULT默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事务时将isolation设置为这个值的话,那么将使用底层数据库的默认事务隔离级别。顺便说一句,如果使用的MySQL(REPEATABLE_READ),oracle(READ_COMMITED)。
READ_UNCOMMITTED读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
READ_COMMITED

读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读

REPEATABLE_READ

重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决

SERLALIZABLE

串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了

 

 

 

 

 

 

 

 

 

事务的传播行为(七种)

解决的问题:业务层方法相互调用,产生的事务应该如何传递

前三个传播行为是一类,优先选择Sevice1.aaa()的事务,事务在业务层,aaa,bbb在一个事务中

后三个aaa,bbb不在一个事务,a有都挂起

最后一个aaa执行完使用事务设置一个保存点,再去执行bbb,bbb没异常就一起提交,有异常回滚到保存点或者初始状态

传播行为说明
TransactionDefinition.PROPAGATION_REQUIRED当前如果有事务,Spring就会使用该事务;否则会开始一个新事务
TransactionDefinition.PROPAGATION_SUPPORTS当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务
TransactionDefinition.PROPAGATION_MANDATORY当前如果有事务,Spring就会使用该事务;否则会抛出异常
TransactionDefinition.PROPAGATION_REQUIRES_NEWSpring总是开始一个新事务。如果当前有事务,则该事务挂起
TransactionDefinition.PROPAGATION_NOT_SUPPORTEDSpring不会执行事务中的代码。代码总是在非事务环境下执行,如果当前有事务,则该事务挂起
TransactionDefinition. PROPAGATION_NEVER即使当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常
TransactionDefinition. PROPAGATION_NESTED如果当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与Transaction- Definition.PROPAGATION_REQUIRED一样

 

 

 

 

 

 

 

 

 

还有事务的超时时间,是否只读

事务状态TransactionStatus
事务具体运行状态(是不是已经提交了,是否有保存点,是你不是新的事务)

名称说明
void flush()刷新事务
boolean hasSavepoint()获取是否存在保存点
boolean isCompleted()获取事务是否完成
boolean isNewTransaction()获取是否是新事务
boolean isRollbackOnly()获取是否回滚
void setRollbackOnly()设置是否回滚

 

 

 

 

 

 

 

 

Spring事务管理

Spring支持的两种方式事务管理

     -编程式的事务管理

  •    在实际应用中很少使用
  •    通过TransactionTemplate手动管理事务

   -使用XML配置声明事务

  •    开发中推荐使用(代码侵入性最小)
  •     spring的声明式事务通过AOP实现的(面像切面的增强型)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值