博客
关于我
mysql加强(7)~事务、事务并发、解决事务并发的方法
阅读量:789 次
发布时间:2023-02-12

本文共 1084 字,大约阅读时间需要 3 分钟。

1. 事务(Transaction)

在数据库中,事务是指一组逻辑操作(不可分割的多个操作),从一个状态变成另一个状态。无论是成功还是失败,事务都作为一个整体执行,要么全部执行,要么全部不执行。

1.1 事务的ACID属性

ACID是事务的四个核心特性,确保事务的正确性。

  • 原子性(Atomicity):事务是原子操作单元,要么全部执行,要么全部不执行。

  • 一致性(Consistency):事务必须确保数据库从一个一致性状态变为另一个一致性状态。数据在事务开始和结束时必须保持一致,避免数据破坏(数据守恒)。

  • 隔离性(Isolation):事务之间有独立的执行空间,不会互相干扰。并发执行的事务之间彼此独立。

  • 持久性(Durability):事务一旦提交,数据修改是永久的,无法回滚。

事务本身并不具备ACID特性,但我们需要确保事务满足这些特性,才能称其为正确的事务。

1.2 事务的操作

  • 提交(Commit):当所有逻辑操作正常执行时,提交事务。

  • 回滚(Rollback):当任何逻辑操作失败时,撤销所有操作,恢复到最初状态。

1.3 隔离级别

隔离性是ACID特性中的一个重要部分,具体表现为不同的隔离级别。隔离级别越高,数据一致性越强,但并发性能也会受到更大影响。

  • MySQL默认隔离级别:可重复读(Repeatable Read),避免脏读和不可重复读,但可能存在幻读。

  • 默认情况下不会出现幻读:除非使用select * from 表名 lock in share mode

1.4 并发问题

数据库事务并发可能导致多种问题,主要包括:

  • 第一类丢失更新(Rollback Loss):事务A提交后,事务B回滚导致事务A的数据被撤销。

  • 第二类丢失更新(Overwrite Loss):事务A提交后,事务B的修改覆盖了事务A的数据。

  • 脏读(Dirty Read):事务A未提交时,事务B读取了A的修改数据。

  • 幻读(Phantom Read):事务A在本次事务中两次读取同一数据,结果不同。

  • 不可重复读(Non-Repeatable Read):事务A两次读取同一数据,结果不同。

  • 1.5 解决方法

    1.5.1 悲观锁

    • 基于数据库自身的锁机制(写锁)。

    • DML操作自动加锁,DQL操作需手动加锁(如select * from 表名 for update)。

    • 事务A等待事务B完成后,才能继续执行。

    1.5.2 乐观锁

    • 在表中添加版本字段,记录修改次数。

    • 事务A在读取数据前检查版本,发现冲突时重试或阻止其他事务。

    通过乐观锁可以减少事务阻塞,但可能导致并发问题。

    转载地址:http://jmbfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>
    Mysql中文乱码问题完美解决方案
    查看>>