MYSQL的MYISAM和INNODB的区别

myisam只支持表级锁,不支持事物,可以模仿事务,但是消耗非常大(适合查询大于增删改的表);

innodb是行级锁,支持事物(适合增删改大于查询的表,默认是innodb引擎);

在这里插入图片描述
并发带来的问题,

  • 脏读:一个事务读到另外一个事务还没有提交的数据;
    解决方法:把事务隔离级别调整到READ COMMITTED,即SET TRAN ISOLATION LEVEL READ COMMITTED。这时我们重复上面的动作会发现事务二会一直等到事务一执行完毕再返回结果,因为此时事务以已经把自己的更改ROLLBACK了,所以事务二可以返回正确的结果 。

  • 幻读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同;
    解决方法:把事务隔离级别调整到SERIALIZABLE。使用SET TRAN ISOLATION LEVEL SERIALIZABLE。这时我们重复上面的动作会发现事务二会一直等到事务一执行完毕再返回结果。

  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同;
    解决方法:把事务隔离级别调整到REPEATABLE READ。使用SET TRAN ISOLATION LEVEL REPEATABLE READ。这时我们重复上面的动作会发现事务二会一直等到事务一执行完毕再返回结果。

  • 更新丢失:2个事务同时修改一个数据,必定有一个事务的更新丢失;
    解决方法:把事务隔离级别调整到READ COMMITTED,即SET TRAN ISOLATION LEVEL READ COMMITTED;

更新丢失举个栗子
比如5000块钱,2个人同时操作,你存500我存1000,那么结果是6000,那500的更新丢失了,少了500块,所以才需要排他锁,同一时间,只能一个人独占数据,其他人要改必须要等我改完;

当SQL Server准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。
不管是更新、还是删除 都需要先去查询的
然后呢,为了提高数据可用性,所以用U锁。。意思就是,我现在在查询,但是等下要更新,所以你们查可以,但是如果你们要更新之类的,那要等我先更新完
举个例子,就是update其实是分为2步,
1.首先会查出需要update的数据行(这个查询过程只会对这些行加S锁)
2.查完之后,开始更新(这个更新时,S锁会变成X锁,这个时候其他线程都不允许增删查改)
这整个一个过程,就叫U锁
包含关系,更新锁包含 S 和 X,U锁并没有实际意义,核心还是S 和 X;

猜你喜欢

转载自blog.csdn.net/yuanting_/article/details/96477003