mysql的事务级别以及死锁

一:read uncommitted(未提交读):在这个级别中,事务中的修改即使没有提交,对其他事务都是可见的。事务可以读取未提交的数据,也称为脏读,性能没好多少,但是问题不少,一般很少使用

二:read committed(提交读):是大多数数据库系统的默认级别(mysql不是),满足事务隔离性的简单定义:从事务开始到结束之前,所做的任何修改对其他事务都是不可见的。有时候也叫不可重复读,因为两次执行同样的查询,可能会得到不一样的结果

三:repeatable read(可重复读):解决了脏读,该级别保证了在同一事务中多次读取同样纪录的结果是一致的,但还是无法解决幻读的问题,幻读:指的是某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取时,会产生幻行,innodb通过多版本并发控制(mvcc)解决了幻读的问题。

四:serializable(可串行化):是最高的隔离级别,通过强制事务串行执行,避免了幻读的问题。会在读取的每一行数据上都加锁,可能导致大量的超时和锁争用的问题

五:死锁:

原因:innodb中会使用行锁来提高并发,当都执行了一条sql时,一个获取了id=4的锁,一个获取了id=3的锁,此时执行下一条语句时,第一个事务一需要3的锁(应该是执行完某一行记录的时候,亦或者说是事务提交之后,只有都完成了排它锁才会自动释放),此时它有着id=4的锁,但是拿不到3的锁,就会一直卡着,导致死锁

猜你喜欢

转载自blog.csdn.net/qq_35152911/article/details/81558461