Mysql事务控制
作者:互联网
事务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