MySQL--事务·ACID·脏读、不可重复读,幻读、隔离级别(详解)

1. mysql中事务特性以及隔离机制
2.MYSQL中 的 ACID
3.mysql中   脏读,不可重复读,幻读
4.在MySQL中 不同隔离级别解决什么问题(实际操作验证)


1. MySQL中的事务特性指的是一系列操作的集合,这些操作要么全部成功提交,要么全部回滚,以保证数据的一致性和完整性。MySQL的事务隔离机制指的是控制并发访问数据库时,各个事务之间如何相互隔离,以避免出现并发访问引发的问题。

2. ACID是指数据库事务应该具备的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。原子性指数据库事务是不可再分割的最小工作单位,要么全部执行成功,要么全部失败回滚。一致性指事务执行前后,数据库中的数据必须保持一致状态。隔离性指多个事务并发执行时,彼此之间应该是隔离的,互相不干扰。持久性指一旦事务提交成功,对数据库中的数据变更应该是持久的。

3. 脏读(Dirty Read)指在一个事务中读取到了另一个未提交事务所修改的数据。不可重复读(Non-repeatable Read)指在同一个事务中多次读取同一条记录时,由于其他事务对该记录进行了修改,导致读取到的值不一致。幻读(Phantom Read)指在同一个事务中多次查询同一个范围的数据时,由于其他事务对该范围的数据进行了插入或删除操作,导致查询结果不一致。

4. 在MySQL中,不同的隔离级别可以用来解决不同的问题:
   - 读未提交(Read Uncommitted)隔离级别最低,可以解决脏读问题,但无法解决不可重复读和幻读问题。


START TRANSACTION;
SELECT * FROM table_name; -- 获取数据 A

START TRANSACTION;
UPDATE table_name SET data = 'B' WHERE id = 1; -- 更新数据 A 为 B,但尚未提


SELECT * FROM table_name; -- 可能读取到数据 B
COMMIT;

COMMIT;
   - 读已提交(Read Committed)隔离级别可以解决脏读和不可重复读问题,但无法解决幻读问题。
-- 会话 1
START TRANSACTION;
SELECT * FROM table_name; -- 获取 A
-- 会话 2
START TRANSACTION;
UPDATE table_name SET data = 'B' WHERE id = 1; -- 更新数据 A 为 B,但尚未提交
-- 会话 1
SELECT * FROM table_name; -- 可能读取到数据 B
COMMIT;
-- 会话 2
COMMIT;

   - 可重复读(Repeatable Read)隔离级别可以解决脏读和不可重复读问题,但无法解决幻读问题。
-- 会话 1
START TRANSACTION;
SELECT COUNT(*) FROM table_name; -- 获取结果为 10
-- 会话 2
START TRANSACTION;
INSERT INTO table_name VALUES (11); -- 插入一条新的数据,但尚未提交
-- 会话 1
SELECT COUNT FROM table_name; -- 获取结果为10,虽然会话 2 已经插入一行数据
COMMIT;
-- 会话 2
COMMIT;
   - 串行化(Serializable)隔离级别最高,可以解决脏读、不可重复读和幻读问题,但会导致并发性能下降。

下面是使用Redis命令操作各种数据类型的样例:

1. String(字符串):
   - 设置键值对:SET key value
     ```
     SET name "John"
     ```
   - 获取键对应的值:GET key
     ```
     GET name
     ```
   
2. List(列表):
   - 在列表左侧添加元素:LPUSH key value
     ```
     LPUSH fruits "apple"
     ```
   - 获取列表指定范围的元素:LRANGE key start stop
     ```
     LRANGE fruits 0 -1
     ```
   
3. Set(集合):
   - 向集合添加元素:SADD key member
     ```
     SADD countries "China"
     ```
   - 获取集合的所有元素:SMEMBERS key
     ```
     SMEMBERS countries
     ```
   
4. Sorted Set(有序集合):
   - 向有序集合添加元素:ZADD key score member
     ```
     ZADD leaderboard 100 "Player A"
     ```
   - 获取有序集合指定范围内的元素:ZRANGE key start stop
     ```
     ZRANGE leaderboard 0 -1 WITHSCORES
     ```
   
5. Hash(哈希表):
   - 设置哈希表字段的值:HSET key field value
     ```

     HSET user id 123
     ```
   - 获取哈希表的字段值:HGET key field
     ```
     HGET user id
     ```
   
6. Bitmaps(位图):
   - 设置位图指定偏移处的值:SETBIT key offset value
     ```
     SETBIT visit_status 0 1
     ```
   - 获取位图指定偏移处的值:GETBIT key offset
     ```
     GETBIT visit_status 0
     ```
   
7. HyperLogLog(基数估计):
   - 添加元素到HyperLogLog:PFADD key element
     ```
     PFADD visits "127.0.0.1"
     ```
   - 获取HyperLogLog的基数估计值:PFCOUNT key
     ```
     PFCOUNT visits
     ```
   
8. Geospatial(地理空间):
   - 添加地理位置到键:GEOADD key longitude latitude member
     ```
     GEOADD locations 13.4125 52.5233 "Berlin"
     ```
   - 获取地理位置的距离:GEODIST key member1 member2 [unit]
     ```
     GEODIST locations "Berlin" "Paris" km
     ```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
脏读是指一个事务可以读取到另一个事务未提交的数据。不可重复读是指在一个事务内多次读取同一数据时,由于其他事务的修改导致每次读取的结果不一致。幻读是指在一个事务内多次执行相同的查询,由于其他事务的插入或删除导致每次查询的结果不一致。 在MySQL中,事务隔离级别对应的脏读不可重复读幻读的情况如下: - 读未提交(READ UNCOMMITTED)级别下存在脏读不可重复读幻读的问题。 - 读已提交(READ COMMITTED)级别下不存在脏读的问题,但仍可能存在不可重复读幻读的问题。 - 可重复读(REPEATABLE READ)级别下不存在脏读不可重复读的问题,但仍可能存在幻读的问题。 - 串行化(SERIALIZABLE)级别下不存在脏读不可重复读幻读的问题。 因此,在MySQL中,脏读不可重复读幻读都是与事务隔离级别密切相关的读一致性问题。根据需求和业务场景,可以选择合适的事务隔离级别来解决这些问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mysql-详解脏读不可重复读幻读](https://blog.csdn.net/ahuangqingfeng/article/details/124407846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [一文搞懂MySQL脏读,幻读不可重复读](https://blog.csdn.net/liuqinhou/article/details/126360614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔橘猫不吃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值