标签:sql语句 导致 区别 分割 幻读 行锁 允许 读取 约束
数据库锁:数据库锁出现的原因是为了处理并发问题。
并发控制一般采用三种方法,分别是乐观锁和悲观锁以及时间戳。
乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据,就是不做任何操作。悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据,其实就是持一种比较保守的态度,悲观锁就是在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己把数据读完了,才允许别人修改那部分数据,或者反过来说,就是自己修改某条数据的时候,不允许别人读取该数据,只有等自己的整个事务提交了,才释放自己加上的锁,才允许其他用户访问那部分数据。悲观锁所说的加“锁”。
悲观锁分为:
读锁/共享锁:共享的锁,多个客户端可以同时读取一个资源,互补干扰。
写锁/排它锁:一个锁会阻塞其他的写锁和读锁,确保一个时刻只有一个客户端对通过一个数据进行修改写入。
时间戳就是在数据库表中单独加一列时间戳,比如“TimeStamp”,每次读出来的时候,把该字段也读出来,当写回去的时候,把该字段加1,提交之前 ,跟数据库的该字段比较一次,如果比数据库的值大的话,就允许保存,否则不允许保存。
表锁 是开销比较小的策略,会锁定整张表。MyISAM和InnoDB都支持表级锁定。用户对表进行写操作,需要先获得锁,并且会阻塞用户对该表的所有读操作。 数据库中对表进行修改,如alter table会使用到表锁,会锁定整张表,因此此类操作在数据库中应该谨慎使用。
行锁 行锁可以高效的支持并发,当然锁开销也是最大。MySQL的InnoDB引擎中实现了行锁,在用户写数据时,只锁定需要操作的数据行,相比于表锁并发度更好。
InnoDB支持事务,
事务是数据库区别于文件系统的额重要特性之一。事务符合ACID特性。原子性:原子性是指数据库事务是不可分割的工作单位。只有数据库事务中的所有数据库操作执行都成功,才算整个事务成功。如果事务中的任何一个SQL语句执行失败,已经执行的SQL语句也必须撤销,数据库状态退回到执行事务前的状态。
一致性:事务执行之前和之后,数据库的完整性约束没有被破坏。
隔离性:一个事物的影响在它提交前对其他事务不可见(通过锁来实现)
持久性:事务一旦提交,其结果就是永久性的。
原子性,一致性,持久性通过redo,undo来完成。
并发事务所带来的问题:
SELECT * FROM emp WHERE empid > 100 FOR UPDATE
两个用户分别锁定一个资源,之后双方又都等待双方释放所锁定的资源,就产生一个锁定请求环,从而出现死锁。死锁往往出现在行级锁中。
如何解决死锁?
在InnoDB的事务管理和锁定机制中,有专门用于检测死锁的机制。当检测当死锁时,InnoDB会选择产生死锁的两个事务中的较小的一个完成回滚。
标签:sql语句 导致 区别 分割 幻读 行锁 允许 读取 约束
原文地址:https://www.cnblogs.com/smallJunJun/p/9573959.html