标签:控制 事务 修改 read 并发 Mysql table select
事务Transaction
- 并发控制的基本操作
- 可以看成一系列的SQL语句
- 要么成功,要么失败,失败回滚
事务特性ACID
- 原子性Atomicity:事务内的操作要么全部成功,要么全部失败
- 一致性Consistency:事务开始和结束后,数据完整性没有被破坏
- 隔离性Isolation:多个事务同时对数据库进行操作,互不影响
- 持久性Durability:事务结束后,修改是永久的,不会丢失
其实事务主要是为了实现 C ,也就是一致性,具体是通过AID,即原子性、隔离性和持久性来达到一致性的目的,所以这四个不应该相提并论,但是他们就想拼成单词,就把它们排好序搞在一起来念。
MVCC(Mutil-Version Concurrency Control)
多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。
应用特点是读多写少,读锁和读锁之间不互斥提高并发,写锁和写锁、读锁都互斥
想要提高并发,寻求读锁和写锁不冲突的方法:undolog版本链
这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。SELECT可以去版本链中拿记录,这就实现了写-读的并发执行
参考:[https://baijiahao.baidu.com/s?id=1629409989970483292&wfr=spider&for=pc]
[https://zhuanlan.zhihu.com/p/66791480]
不对事务进行并发控制
-
幻读(phantom read): 同一事务内 第二次查出第一次没有的结果(其他事务进行插入操作并且提交了)
-
解决幻读
MVCC加上间隙锁的方式
(1)在快照读读情况下,mysql通过mvcc来避免幻读。
(2)在当前读读情况下,mysql通过next-key来避免幻读。锁住某个条件下的数据不能更改。快照读:简单的select操作,属于快照读,不加锁。(当然,也有例外,下面的select) 当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。
select * from table where ? lock in share mode; select * from table where ? for update; insert into table values (…); update table set ? where ?; delete from table where ?;
-
-
非重复读(nonrepeatable read):一个事务重复读两次得到不同结果
- 采用行锁和可重复读的事务隔离级别可以解决
-
脏读(dirty read):一个事务读取到另一个事务没有提交的修改
-
修改丢失(lost update):并发写入造成修改丢失
解决并发控制异常:四种事务级别
- 读未提交(read uncommited)
- 读已提交(read commited)
- 可重复读(repeatable read):同一个事务先后查询结果一样 (Innodb引擎默认级别)
- 串行化(serializable)
高并发下的插入重复
- 数据库层面:唯一索引
- 使用队列异步写入
- redis实现分布式锁:插入持有锁,插入完成释放锁
乐观锁和悲观锁
- 悲观锁:先获取锁再操作(select for update)
- 乐观锁:假设没有修改,定义一个版本号(时间戳),修改时发现版本号(时间戳)改变,就得回滚了(check and set)
根据响应速度,冲突频率,重试代价来选择锁类型
标签:控制,事务,修改,read,并发,Mysql,table,select 来源: https://www.cnblogs.com/aleiyoy/p/16603342.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。