ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql事务

2022-08-21 00:33:01  阅读:184  来源: 互联网

标签:事务 隔离 数据 提交 mysql 共享 级别


1.事务是什么?

2.acid特性

3.隔离级别

4.实现:mvcc锁undolog redolog

5.并发异常 读异常 死锁

 

目的:事务讲数据库从一种一致性状态转换成另一种一致性状态。

组成:事务可以是简单的一条语句,可以是一组语句。

 

ACID特性

事务回滚操作依靠undolog来实现,每操作一句,undolog都会记录,回滚时,会做相反的动作。undolog存储在共享表里。

redolog:事务提交后,事务DML操作将会持久化(写入redolog磁盘文件 哪一个页 页 偏移值)即使发生宕机等故障,数据库也能将数据恢复。redolog记录的时物理日志。 

MVCC提供了一种快照读的方式提高并发性能。

mvcc 在sql后不加任何参数时快照读,

当前读:加lock in share mode是共享锁,加for update是排他锁,insert ,update,delete

myisam只支持表锁

 

隔离级别:

隔离级别越高并发性能越低,

 隔离级别由低到高:

read uncommitted:读未提交,该级别下都不加锁,写加排他锁,写锁在事务提交或回滚后释放锁;   容易产生读异常;

read committed:该级别支持MVCC(多版本并发控制),也就是提供一致性非锁定读。此时读取操作读取历史快照数据;该隔离级别下读取历史版本的最新数据,所以读取的是已提交的数据。

repeatable read:可重复读:此时读取操作读取事务开始时的版本数据;  mysql默认这个级别,自动添加排他X锁

serializable:可串行化,该级别下给读加了共享锁,所以事务都是串行化的执行,此时隔离级别最严苛。

 

 

 

select * from table lock in share mode;加读锁

select * from table for update;加写锁

 

排他锁:删除和更新时自动添加X锁,插入时,1.会先添加插入意向锁,insert intention lock,然后再把这个数据加上X锁,2.如果是自增,会添加auto-inc lock,自增锁

 

意向共享锁:对一张表中某几行加的共享锁

意向排他锁:对一张表中某几行加的排他锁

目的:为了告诉其他事务,此时这张表被一个事务在访问,作用:排除全表读写锁

 

 

如果是走的辅助索引,则只会给辅助索引加gap锁

 

 

事务开始前加锁持续锁,事务提交或者回滚的时候,释放锁

脏读:隔离级别为读未提交,一个事务读到另一个事务修改的数据(未提交),造成数据错乱。解决办法:提升隔离级别到读已提交

不可重复读:在隔离级别为读已提交或读未提交,同一个事务中,两次查询同一行的数据不一致。发生在两次查询之间有其他事务修改了这一行的数据。解决办法:提升隔离级别到可重复读

幻读:同一事务中,两次查询同一范围出来的结果集不一致。  解决办法:加共享锁,让写的事务阻塞

丢失更新:回滚覆盖,B事务修改一个数据后提交,此时A时候回滚会回滚到之前的版本。数据库拒绝不可能发生。

                 提交覆盖,两个事务同时操作一个数据,最后操作并提交的会覆盖前一个操作的数据。解决办法:加锁,共享锁或者写锁

共享锁(S锁)又称为读锁,若事务T对数据对象A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

死锁的一个典型场景:事务A先申请数据行1的共享锁,然后申请数据行2的排他锁。事务B先申请数据行2的共享锁,后申请数据行1的排他锁。结果事务A和B申请完共享锁后,申请排他锁的请求都被对方block住了,导致死锁。

搜索

复制

标签:事务,隔离,数据,提交,mysql,共享,级别
来源: https://www.cnblogs.com/cuijy1/p/16275178.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有