事务...

本文详细介绍了事务的四大特性:原子性、一致性、隔离性和持久性,并讨论了不考虑隔离性可能导致的安全问题,如脏读、不可重复读和幻读。接着,讲解了解决这些问题的数据库隔离级别,包括Read Uncommitted、Read Committed、Repeatable Read和Serializable。此外,还涉及了Spring框架中的事务管理,包括PlatformTransactionManager接口及其实现类,以及TransactionDefinition和TransactionStatus接口。文章最后提到了事务的传播行为和如何在实际项目中应用事务,如银行转账功能的实现。
摘要由CSDN通过智能技术生成

事务

1.事务:指的是逻辑上一组操作,组成这个事务的各个执行单元,要么一起成功,要么一起失败!

2.事务的特性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

3.如果不考虑隔离性,引发安全性问题

  • 读问题:
  • 脏读: 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  • 不可重复读::事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
  • 虚读: 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
  • 写问题:
  • 丢失更新:
  •  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

4.如何解决安全性问题

  • 读问题解决,设置数据库隔离级别

  • 写问题解决可以使用 悲观锁和乐观锁的方式解决

  • 通过设置事务的隔离级别

    Read uncommitted: 读未提交,不能解决任何读取的问题。

    Repeatable read: 可重复读,可解决脏读和不可重复读,但虚读、幻读可能会发生

    Read committed: 读已提交,解决脏读,虚度/幻读 和 不可重复读有可能发生。

    Serialzable : 解决所有读的问题。

Spring框架的事务管理相关的类和API

  1. PlatformTransactionManager接口 -- 平台事务管理器.(真正管理事务的类)。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类!
  2. TransactionDefinition接口 -- 事务定义信息.(事务的隔离级别,传播行为,超时,只读)
  3. TransactionStatus接口 -- 事务的状态

总结:上述对象之间的关系:平台事务管理器真正管理事务对象.根据事务定义的信息TransactionDefinition 进行事务管理,在管理事务中产生一些状态.将状态记录到TransactionStatus中

PlatformTransactionManager接口中实现类和常用的方法

  1. 接口的实现类

    如果使用的Spring的JDBC模板或者MyBatis框架,需要选择DataSourceTransactionManager实现类

    如果使用的是Hibernate的框架,需要选择HibernateTransactionManager实现类

  2. 该接口的常用方法

    void commit(TransactionStatus status)

    TransactionStatus getTransaction(TransactionDefinition definition)

    void rollback(TransactionStatus status)

  3. TransactionDefinition

    事务隔离级别的常量

    static int ISOLATION_DEFAULT -- 采用数据库的默认隔离级别

    static int ISOLATION_READ_UNCOMMITTED

    static int ISOLATION_READ_COMMITTED

    static int ISOLATION_REPEATABLE_READ

    static int ISOLATION_SERIALIZABLE

    2.事务的传播行为常量(不用设置,使用默认值)

    先解释什么是事务的传播行为:解决的是业务层之间的方法调用!!

    PROPAGATION_REQUIRED(默认值) -- A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来.(保证A,B在同一个事务中),默认值!!

    PROPAGATION_SUPPORTS -- A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务. * PROPAGATION_MANDATORY -- A中有事务,使用A中的事务.如果A没有事务.抛出异常. * PROPAGATION_REQUIRES_NEW(记)-- A中有事务,将A中的事务挂起.B创建一个新的事务.(保证A,B没有在一个事务中) * PROPAGATION_NOT_SUPPORTED -- A中有事务,将A中的事务挂起.

    PROPAGATION_NEVER -- A中有事务,抛出异常.

    PROPAGATION_NESTED(记) -- 嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)

    事务的使用

    银行转账功能

    pom.xml配置

    <?xml version="1.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值