ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

事务管理和Spring事务管理简介

2022-02-28 19:33:01  阅读:174  来源: 互联网

标签:事务管理 事务 隔离 简介 提交 Spring 时刻 读取


文章目录



# 事务管理

事务简介

事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。

• 事务的特性(ACID)

  • 原子性(Atomicity):事务是应用中不可再分的最小执行体
  • 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态。
  • 隔离性(Isolation):各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的。
  • 持久性(Durability):事务一旦提交,对数据所做的任何改变都要记录到永久存储器中。

事务的隔离性

常见的并发异常

  • 第一类丢失更新、第二类丢失更新。
  • 脏读、不可重复读、幻读

常见的隔离级别 隔离级别从低到高

  • Read Uncommitted:读取未提交的数据。
  • Read Committed:读取已提交的数据。
  • Repeatable Read:可重复读。
  • -Serializable:串行化。

第一类丢失更新

比如事务2在T4时刻提交数据把N修改为9,然而在T6时刻事务1发生了回滚,把N的值修改为10;

事务1的回滚导致了事务2已经更新的数据丢失。

在这里插入图片描述

第二类丢失更新

比如事务2在T4时刻提交数据把N修改为9,然而在T6时刻事务1提交了事务,把N的值修改为11;

事务1的提交导致了事务2已经更新的数据丢失。

在这里插入图片描述

脏读

事务2在T3时刻读取到了事务1在T2时刻修改过的数据,此时N=11,然后事务1在T4时刻进行了回滚,修改N的值为10;

事务2读取到了事务1为提交的数据

在这里插入图片描述

不可重复读

事务2在T2时刻读取N为10,T4时刻事务1提交事务修改N为11,事务2在T5时刻再次读取N,此时值为11,两次读取的结果不一致;

在这里插入图片描述

幻读

事务2在T1时刻查询到3条数据,事务1在T3时刻提交事务导致食物2在T4时刻查询到4条数据,两次查询到的行数不一样

在这里插入图片描述

事务隔离级别

–级别从低到高

–性能从高到低

在这里插入图片描述

在这里插入图片描述

事务的传播机制

解决两个事务交叉在一起的时候以谁的事务为准的问题

–REQUIRED :支持当前事务(外部事务),比如A事务调用B事务,B事务以A事务的事务为标准,如果A不存在事务则创建一个新的事务;

–REQUIRED_NEW :创建一个新事务,按照B事务的标准执行,不管A是否有事务,如果有事务暂定当前事务(外部事务)即A事务;

–NESTED:如果当前存在事务(外部事务),则嵌套在该事务中执行,即如果A有事务,B事务有独立的提交和回滚,如果A没有事务则创建一个新的事务,和REQUIRED一样。

Spring事务管理

• 声明式事务 (常用注解)

- 通过XML配置,声明某方法的事务特征。

- 通过注解,声明某方法的事务特征。

在方法上添加注解,isolation设置隔离级别;propagation设置传播机制

 @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)

• 编程式事务 (方法步骤较多,对中间特定步骤添加事务管理的时候常用)

- 通过 TransactionTemplate 管理事务,

并通过它执行数据库的操作

1、注入TransactionTemplate

2、设置隔离级别和传播机制

3、调用execute方法,传入回调接口

4、使用匿名内部类,实现 doInTransaction 方法里写业务逻辑

 @Autowired
    private TransactionTemplate transactionTemplate;


public Object save2() {
    transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
    transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

    return transactionTemplate.execute(new TransactionCallback<Object>() {
        @Override
        public Object doInTransaction(TransactionStatus status) {

        }
    });
}

标签:事务管理,事务,隔离,简介,提交,Spring,时刻,读取
来源: https://blog.csdn.net/Qiuyuguohou/article/details/123189795

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有