事务的基本要素(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锁,顾名思义,排它锁不能与其它锁并存,而且只有一个事务能拿到某一数据行的排它锁,其余事务对于该数据的操作将会被阻塞,直至锁释放。
共享/排它锁的使用场景:
共享锁
- 确保某个事务查到最新的数据;
- 这个事务不需要对数据进行修改、删除等操作;
- 也不允许其它事务对数据进行修改、删除等操作;
- 其它事务也能确保查到最新的数据。
排它锁
- 确保某个事务查到最新的数据;
- 并且只有该事务能对数据进行修改、删除等操作。
原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/tech/database/244471.html