数据库锁机制

来源:互联网 发布:软件测试技术大全 pdf 编辑:程序博客网 时间:2024/06/03 17:22

概念

为了保证数据的完事性和一致性,数据库系统采用锁来实现事务的隔离性。

锁的种类

共享锁

共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。
获取共享锁的事务只能读取数据,不能修改数据
使用
SELECT …. LOCK IN SHARE MODE
在没有排它锁的情况下,能够获取共享锁。

更新锁

防止死锁用的,更新锁需要更新数据的时候,更新锁升级为排它锁,我理解更新锁是为了升级排它锁所使用的中间锁。

排他锁

排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。排它锁,其他事务既不能读也不能写。
使用
SELECT …. FOR UPDATE

意向锁

用于表明设置的标示,表明该表有没有被锁,优点是效率高。

加锁时机

  • 开启事务,数据库自动加排他锁。
  • 如果数据库允许脏读,则不加共享锁。

锁粒度

  • 行锁
  • 页锁
  • 整表锁

锁的粒度同样既可以由数据库自动管理,也可以通过手工指定hint来管理。

select * from table (paglock)select * from table (rowlock)select * from table (tablock)

锁的等待

SET LOCK_TIMEOUT 4000 用来设置锁等待时间,单位是毫秒

悲观锁

它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度(悲观),因此,在整个数据处理过程中,将数据处于锁定状态。
实现:利用数据库本身的锁机制实现。比如行锁、表锁等。

乐观锁

事务每次去操作数据之前,都假设其他事务不会修改这些需要访问的数据 ,所以 在访问之前不要求上锁,只是在进行更新修改操作的时候判断一下在访问的期间有没有其他人修改数据 了。它适用于多读的应用类型,
实现:完全依靠数据库事务来管理。
1.对记录加版本号.
2.对记录加时间戳.
3.对将要更新的数据进行提前读取、事后对比

hibernate 配置

<hibernate-mapping>        <class name="com.f.TProfit" table="t_profit" optimistic-lock="version"></class>      </hibernate-mapping>
原创粉丝点击