MySQL数据库隔离级别和锁
共享锁:又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
排它锁:又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
隔离级别:未提交读--read uncommitted:是指在当前隔离级别下,会读取到没有提交的数据。
如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。
实现:在读取时是不加锁,但在写时,对其加行级排它锁,事务结束时释放。
能解决的问题:不能解决问题。
产生的问题:脏读(脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据)。
隔离级别:已提交读--read committed:是指在当前隔离级别下,只能读取到已提交的数据。
实现:在写数据的时候添加行级排它锁,这样写过程是无法读取的,直到事务处理完毕才释放排他锁;
在读数据的时候添加行级共享锁样读的时候也是无法写的,但是一旦读完该行就释放共享锁。
能解决的问题:脏读。
产生的问题:一、不可重复读:事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
二、更新丢失:事务A获得写锁更新数据,释放锁;事务B继续获得该写锁更新数据,释放锁;A的数据就被覆盖,从而产生更新丢失。
隔离级别:可重复读--reapetable read:在这种隔离级别下可以重复的读取数据了
实现:给写的数据加行级排他锁,事务结束释放,给读的数据加行级共享锁,事务结束后释放。
能解决的问题:脏读、不可重复读、更新丢失
产生的问题:幻读(事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据,
这是因为在两次查询过程中有另外一个事务插入数据造成的)
隔离级别:序列化--serializable :提供严格的事务隔离
实现:事务读数据则加表级共享锁,事务写数据则加表级排他锁。
能解决的问题:脏读、不可重复读、更新丢失、幻读。
纸上得来终觉浅
绝知此事要躬行