MySQL读写的并发问题-创新互联
解决读写的并发问题可以使用 MVCC(多版本并发控制) 和 锁机制来解决。
MVCC方式 的性能高于 加锁方式, 加锁方式需要排队,影响效率。
MVCC主要依赖于 数据库记录的三个隐藏字段、 undo.log 、 readView 来实现。
1、三个隐藏字段 (1) DB_TRX_ID : 最后一次操作的事务id;
(2) DB_ROLL_PTR:回滚的指针,执行上一个版本的记录,配合undo.log 使用
(3) DB_ROW_ID : 隐藏主键,如果表中没有主键才会创建。
2.undo.log (回滚日志)在 insert、delete、 update 就会产生便于回滚的数据记录,写入到回滚日志中。
当insert,执行提交后,会马上删除回滚记录, delete、update会保留,用于快照读时使用(快照读-不加锁读,读取的数据记录是可见版本)
当不同事务都并发修改同一条记录时 ,会产生一条undo版本链(链表)
是快照读执行是MVCC读取数据的依据,
里面包括4个核心字段
m_ids :当前活跃的事务id集合
min_trx_id:最小活跃事务id
max_trx_id:预分配事务id(当前事务id+1,事务id是自增的)
createor_trx_id: ReadVieiw创建者的事务id
不同隔离级别的ReadView生成机制不同,
ReadUncommited:每次select 都会生成一个ReadView
Repeatable Read: 只有当前事务,第一个select会生成ReadView,后面复用。
**实现: 通过版本链的数据访问规则。**来读取记录。
三、锁机制 1、按数据操作方式分类(1) 读锁
(2)写锁
只有 读锁 与 读锁 兼容
2. 数据操作粒度划分,表锁,行级锁,页锁(1)表锁:
S .X . 意向锁、元数据锁。
使用:
LOCK TABLE 表名 READ;
LOCK TABLE 表名 WRITE;
意向锁:
给更大级别加锁(向上加锁), 如:对行加锁,系统自动会给,表加锁。
解决其他事务来 对表加锁 时需要一条条判断是否加锁。
元数据锁,系统自动加,当增删改查时会自动加MDL读锁, 修改表结构时加MDL写锁.
(2)行锁
增删改操作会自动加锁
共享锁: lock in share mode;/ FOR SHARE;
排他锁: FOR UPDATE;
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前题目:MySQL读写的并发问题-创新互联
当前URL:http://cdiso.cn/article/dspisg.html