【数据库】数据库并发操作(二)数据库并发控制机制

为了充分利用数据库资源,发挥数据库共享资源的特点,应该允许多个用户并行地存取数据库。但这样就会产生多个用户程序并发存取同一数据的情况,若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性,所以数据库管理系统必须提供并发控制机制。并发控制机制的好坏是衡量一个数据库管理系统性能的重要标识之一。

一、基础知识

(一)事务

事务是由一组 SQL语句组成的逻辑处理单元,事务具有以下 4个属性,通常简称为事务的 ACID属性:

  • 原子性:事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  • 一致性:在事务开始和完成时,数据都必须保持一致性状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构也都必须是正确的。
  • 隔离性:数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的。
  • 持久性:事务完成之后,它对于数据的修改是永久性的。
    数据库事务属性是由数据库管理系统来进行保证的,在整个应用程序运行过程中应用无需去考虑数据库的 ACID实现。

(二)数据库锁

(三)事务的隔离等级

这里写图片描述

 序列化:当数据库系统使用序列化隔离级别时,一个事务在执行过程中完全不到其他事务对数据库所做的更新。事务实际上以串行化方式运行。
 可重复读:一个事务在执行过程中可以看到它事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。
 已提交读:一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经较的对已有记录的更新。
 未提交读:一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

二、并发处理

(一)数据锁定机制

用数据锁定机制来解决,实现事务的隔离;
隐式上锁、显示上锁;
一般的隐式上锁可以解决数据一致性问题;
一些数据库引擎会给数据库操作语句自动加读锁或者写锁,无需用户干预。但是用户可以通过手动加锁的方式进行显示上锁。例如mysql的InnoDB存储引擎,对于 UPDATE、DELETE 和INSERT语句, InnoDB会自动给涉及数据集加排他锁( X);对于普通SELECT语句, InnoDB不会加任何锁。但是用户可以使用select……in share mode获得共享锁,用select…for update获得排它锁;

(二)封锁类型

共享锁(S锁)
排他锁(X锁)

(三)封锁粒度

表级锁
行级锁
键范围锁

(三)乐观锁和悲观锁

悲观锁(依靠数据库的锁机制):用select…for update获得排它锁;使用select……in share mode获得共享锁
乐观锁(依靠增加版本或者时间判断字段):(1)数据版本记录机制(2)增加时间戳字段

数据库锁分为共享锁、排它锁、更新锁等;悲观锁和乐观锁是从程序员开发的角度考虑的。
对于一般的用户而言,通过系统的自动锁定管理机制基本可以满足使用要求。 但是涉及到写操作,还是一定要理解隔离机制和并发可能带来的问题,在事务中或者SQL中加入锁机制(例如悲观锁的实现)。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值