事务的基本要素(ACID)
- 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,就像化学中学过的原子,是物质构成的基本单位。
- 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
- 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
- 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
事务的并发问题
- 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
- 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
- 幻读:管理员A将数据库中所有学生的成绩从具体分数改为ABC等级,但是管理员B就在这个时候插入了一条具体分数的记录,当管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
MySQL事务隔离级别
- RU读未提交(read-uncommitted):是脏读,是不可重复读,是幻读
- RC不可重复读(read-committed):不是脏读,是不可重复度,是幻读
- RR可重复读(repeatable-read):不是脏读,不是不可重复度,是幻读
- 串行化(serializable):不是脏读,不是不可重复度,不是幻读
mysql默认的事务隔离级别为可重复读(repeatable-read)(RR)
间隙锁只有在事务隔离级别 RR 中才会产生,会封锁该条记录相邻两个键之间的空白区域,防止其它事务在这个区域内插入、修改、删除数据,这是为了防止出现 幻读 现象;
MySQL共享锁与排他锁
共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到最新数据。特点:
- 多个事务的查询语句可以共用一把共享锁;
- 如果只有一个事务拿到了共享锁,则该事务可以对数据进行 UPDATE DETELE 等操作;
- 如果有多个事务拿到了共享锁则所有事务都不能对数据进行 UPDATE DETELE 等操作。
排他锁又称为写锁,简称X锁,顾名思义,排它锁不能与其它锁并存,而且只有一个事务能拿到某一数据行的排它锁,其余事务对于该数据的操作将会被阻塞,直至锁释放。
共享/排它锁的使用场景:
共享锁
- 确保某个事务查到最新的数据;
- 这个事务不需要对数据进行修改、删除等操作;
- 也不允许其它事务对数据进行修改、删除等操作;
- 其它事务也能确保查到最新的数据。
排它锁
- 确保某个事务查到最新的数据;
- 并且只有该事务能对数据进行修改、删除等操作。
标签:事务,幻读,重复,脏读,Mysql,相关,共享,数据 来源: https://www.cnblogs.com/stringarray/p/16124024.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。