数据库锁学习总结

锁的作用:数据库是一个多用户共享的资源,当出现并发的时候就会出现脏读,数据丢失等问题。所以数据库并发需要使用事务来控制,事务并发问题需要数据库锁来控制,所以数据库锁是跟并发控制和事务联系在一起的。

事务特性:ACID(原子性,一致性,隔离性,持久性)四特性,事务是恢复和并发控制的基本单位。

  • 原子性指的是事务是数据库的逻辑工作单位,事务中操作要么都做,要么都不做;
  • 一致性指的是事务的执行结果必须是使数据库从一个一致性状态变大另一个一致性状态,一致性和原子性是密切相关的;
  • 隔离性指的是一个事务执行不能被其他事务干扰;
  • 持久性指的是一个事务一旦提交,他对数据库中数据的改变就是永久性的。

并发控制一般采用三种方法:

1.乐观锁

  乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据,所以不做控制。乐观锁是基于系统存储逻辑,限制较大,可能会引起脏读等情况,得根据实际情况灵活运用(在存储过程,函数使用)。

2.悲观锁

  悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据。所以在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己把数据读完事务提交了,才允许别人修改那部分数据。

  悲观锁可分为共享锁(读锁)和排它锁(写锁),默认来说,当sql脚本修改更新某条记录的时候,会给该条记录加排他锁,读的话加的是共享锁。

  • 排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
  • 共享锁:使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。

3.时间戳

  时间戳就是不加锁,通过时间戳来控制并发出现的问题。时间戳就是在数据库表中单独加一列时间字段,每次读出来的时候,把该字段也读出来,当写回去的时候,把该字段加1,提交之前 ,跟数据库的该字段比较一次,如果比数据库的值大的话,就允许保存,否则不允许保存,这种处理方法虽然不使用数据库系统提供的锁机制,但是这种方法可以大大提高数据库处理的并发量,因为这种方法可以避免了长事务中的数据库加锁开销(操作员A 和操作员B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系 统整体性能表现。但是操作员操作过程中可能会出现数据提交不了的情况,实际业务中限制较大。

猜你喜欢

转载自www.cnblogs.com/zhoufei2514/p/10168998.html