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
```