事务相关概念

  • 事务是什么
    • 作为单个逻辑工作单元执行的一系列操作(一组SQL),并发控制单位,要么全部成功,要么全部失败
  • 事务的特征
    • 原子性:所有的操作会被看成一个逻辑单元,要么全部成功,要么全部失败
    • 一致性:事务在完成时,必须使所有的数据都保持一致的状态,保证数据的完整性
    • 隔离性:并发,事物之间的相互影响——隔离级别
    • 持久性:事务结束后,结果是可以固化的

事务的隔离


事务的隔离级别
👍 未授权读取
👍 授权读取
👍 可重复读取
👍 序列化:隔离级别最高
事务隔离的实现
🤙 悲观锁:基于数据库的锁
🤙 乐观锁:不同的事物可以看到同一对象的不同历史版本

B/S中的事务

一个请求对应一个业务,一个业务其实就应该是一个事务(要么全部成功,要么全部失败

  • 一个请求——一个事务
  • 一个事务——mybatis中事务SqlSession相关
  • 一个请求——启动一个线程——一个事务
    • 当前请求线程所执行的所有操作是属于同一个事务的,使用的是同一个SqlSession
  • 一个线程——同一个SqlSession
    • 如何让一个线程中得到的SqlSession对象是同一个呢?ThreadLocal
  • ThreadLocal
    • 当前线程变量(key/value)
    • 将SqlSession放入线程上下文,线程会执行请求要做的所有方法(很多个dao操作),每次的dao操作所使用的SqlSession都从当前线程上下文取得


  • B/S中实现事务,SqlSession放入ThreadLocal中
    • servletFilter实现请求到达的时候,创建Session放入ThreadLocal

Spring中的事务

  • 事务是一个切面的存在,只需要在Spring配置AOP就可以实现事务了
  • AOP
    • 核心业务:自己继续编写
    • 系统业务(切面):事务这个切面Spring已经提供了实现,不需要自己编写
      • Spring已经提供了实现事务的通知,配置bean就能够使用
        • 事务管理平台:确定事务切面用在那个平台
        • 事务策略定义:事务的属性(隔离级别、传播性等)
        • 事务状态
  • 在Spring中实现事务:配置AOP
    • 将Spring提供的通知类配置到核心业务线
    • 基于注解配置
    • 基于配置文件(AOP的AspectJ)配置


PlatformTransactionManager:确定要做的事务是基于那个平台(JDBC、Hiberante、mybatis、JPA)

Spring+mybatis事务管理

如下图,可以看来Spring与mybatis集成后默认每个操作后都是产生一个新的Session,不构成事务的概念,每个操作就是一个独立的事务。

Spring+mybatis的AOP事务配置

其实如下配置在hibernate中已经可以生效,但是mybatis还需要多加一些配置才能使用

Spring+mybatis的事务实现

🌱 基于注解实现事务




🌱 基于事务管理模板




ps:因作者能力有限,有错误的地方请见谅

  • 喜欢这篇文章的话可以用快捷键 Ctrl + D 来收藏本页
× 请我吃糖~
打赏二维码