mysql的事务及并发
- 事务的ACID
- 并发事务的影响
一、事务及其ACID
概念: 事务是一组sql语句组成的逻辑单元。
ACID属性:
1、原子性(Atomicity): 事务是一个原子操作单元,其对数据得分修改,要么全都执行,要么全都不执行。
2、一致性(Consistent): 在事务开始和完成时,数据都必须保持一致状态,这意味着所有相关的数据都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B+树跟双向链表)都是必须是正确的。
3、隔离性(Isolation): 数据库系统提供一定的隔离机制,保证事务不受外部并发操作的影响而独立进行。这意味着事务处理过程中的中间状态对外部是不可见的。
4、持久性(Durable): 事务完成之后,它对数据的修改是永久性的,即使出现系统故障也能保持。
二、并发事务的影响
1、更新丢失
2、脏读
3、不可重复读
4、幻读
1、更新丢失
当两个事务选中同一行的时候,基于相同的初值更行改行时,由于事务之间不知道其他事务的存在,就会发生更新丢失。即,最后的更新,将覆盖其他事务的更新。
2、脏读
事务A读到了事务B已修改但并未提交的数据,并且在这个数据上进行操作;此时,事务B回滚,就会导致A读取的数据无效,不符合一致性要求。
3、不可重复读(update、delete)
一个事务在读取某些数据后的某个时间,再次读取以前的数据,发现数据改变了,或者被删除了。即,事务A读到了事务B已经提交的修改数据,不符合隔离性。
4、幻读(insert)
一个事务在第二次查询时,发现了其他事务新增的数据行。
三、对于并发事务的解决方案
脏读: 修改时,加上排他锁;读取时,加上共享锁。
不可重复读及更新丢失: 只需对操作的行加上行锁。
幻读: 只需要数据表加上表锁。
四、隔离级别
级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读 | 是 | 是 | 是 |
已提交读 | 否 | 是 | 是 |
可重复读(默认) | 否 | 否 | 是 |
可序列化 | 否 | 否 | 否 |
1、查看当前数据库的隔离级别
show variables like 'tx_Isolation';