spring事务学习整理

Spring虽然提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务处理机制工作的。

一:数据库的四个特性


原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabiliy),简称ACID
在这里插入图片描述

二:数据并发问题

数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性。这些问题可以归结为5类,包括3类数据读问题(脏读、不可重复读和幻象读)及2类数据更新问题(第一类丢失更新和第二类丢失更新)
①脏读
A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作。
在这里插入图片描述
②不可重复读
A事务读取了B事务已经提交的更改数据
在这里插入图片描述
③幻象读
A事务读取B事务提交的新增数据
在这里插入图片描述
幻象读和不可重复读是两个容易混淆的概念,前者是指读到了其他已经提交事务的新增数据,而后者是指读到了其他已经提交事务的更新数据
④第一类丢失更新
A事务撤销时,把已经提交的B事务的更新数据覆盖了
在这里插入图片描述
⑤第二类丢失更新
A事务覆盖B事务已经提交的数据在这里插入图片描述

三:数据库锁机制

按锁对象的不同,一般可以分为表锁定和行锁定。从事务锁定的关系上看,可以分为共享锁定和独占锁定。共享锁定会防止独占锁定,但允许其他的共享锁定,而独占锁定既防止其他的独占锁,也防止其他的共享锁

四:事务隔离级别

在这里插入图片描述
事务的隔离级别和数据库的并发性是对立的。一般来说,使用READ UNCOMMITED隔离级别的数据库拥有最高的并发性和吞吐量,而是用SERIALIZABLE隔离级别的数据库并发性最低

五:ThreadLocal

ThreadLocal并不是一个线程,而是保存线程本地对象的容器。当运行多线程环境的某个对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的变量副本。所以每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。

一般情况下,只有无状态的Bean才可以在多线程环境下共享。在Sping中,绝大部分Bean都可以声明为singleton作用域,正因为spring对一些Bean中非线程安全的"状态性对象"采用ThreadLocal进行封装,让他们也成为线程安全的"状态性对象";

SimpleThreadLocal 的版本比较幼稚,但它和JDK所提供的ThreadLocal类在实现思路上是非常相近的:

package com.smart.transcation;

import java.util.Collections;
import java.util.HashMap
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值