表锁(Table Lock):它会锁定整张表。一个用户在对表进行写操作(插入、删除、更新等)钱,他需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。没有写锁的时候,其他用户可以获得读锁,多用户之间的读锁相互不阻塞。
行级锁(row lock):行级锁能够最大程度的支持并发处理(同时也带来了最大的所开销)。
ACID
ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)
原子性(atomicity):一个事务必须被视为一个最小的工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作
一致性(consistency):数据库总时哦才能够一个一致性的状态转换到另外一个一致性的状态。在执行事务某条语句的时候系统突然蹦会,导致事务最终没有提交,所以事务所作的修改也不会保存到数据库中
隔离性(isolation):通常来说,一个事务所作的修改在最终提交以前,对其他事务是不可见的。在一个事务没有执行结束时,对事务的修改不会影响外部数据。
持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
隔离级别
READ UNCOMMITTED(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被成为脏读(Dirty Read)。除非有非常必要的理由,在实际应用中一般很少使用
READ COMMITTRD(提交读):一个事务开始时,只能看到已经提交的事务所作的修改。Tips:描述类似于隔离性的介绍,这个级别有时候也叫做不可重复读(nonrepeatable read),因为执行两次相同的查询,可能会得到不一样的结果
REPEATABLE READ(可重复读):解决了脏读的问题,该级别保证了在同一事务中多次读取同一记录的结果时一致的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom Read)的问题。所谓幻读,指的是某个事务在读取某个范围内记录时,另外一个事务又在该范围内插入新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。这是MySQL的默认隔离级别
SERIALIZABLE(可串行化):是最高的隔离级别。它通过强制事务串行执行,避免了前面说的欢度的问题。简单来说,SERIAIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超市和锁征用的问题。只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。
死锁:是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一资源时,也会产生死锁。
死锁产生的双重原因:有些是因为真正的数据冲突,有些则完全时由于存储引擎的实现方式导致的。