zoukankan      html  css  js  c++  java
  • 多并发笔记整理

    1,如何判断是多用户系统?

    用户:数据库的用户,每一个用户都有一个UserID,连接数据库时都有一个session会话。

    注意!!!!:任何系统,数据才是最重要的,数据的安全性和正确性。

    一个用户可以启动多个session(session在被认证后才形成,也就是账号密码和数据库一致),session由若干个事务组成,事务由sql语句组成。

    软件开发真正重要的是并发:多个session的事务一定会出现并发冲突。

    并发的前提是共享数据。

    并发一致性:两个事务对共享数据操作时,如果数据正确,就叫并发一致性;

    并发冲突:两个事务对共享数据操作时,如果数据出现错误了,就会出现并发冲突。

    我们要做到的就是,在保证并发一致性基础上,能够运行的最大session量。也就是说,我们要提高并发性。

    2、数据库的设计

    正确数据:a:保证表行列完整性约束 ,保证触发器的完整性。

                      b:业务逻辑性。

                      c:并发一致性。

    数据库的几种隔离级别

    • READ UNCOMMITTED(读未提交数据):允许事务读取未被其他事务提交的变更数据,会出现脏读、不可重复读和幻读问题。
    • READ COMMITTED(读已提交数据):只允许事务读取已经被其他事务提交的变更数据,可避免脏读,仍会出现不可重复读和幻读问题。
    • REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
    • SERIALIZABLE(序列化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,可避免所有并发问题,但性能非常低。

    通过上面可以知道多事务同时运行,如果不采用以上四种隔离机制,可能会产生多个并发问题,其中包括脏读、不可重复读和幻读,下面就解释下这几种并发问题

      存在两个事物(T1,T2)同时运行

    • 脏读:T1读取了已经被T2修改但还未提交的字段,由于某种原因,T2事物回滚,则T1读取的内容是临时且无效的。
    • 不可重复读:T1读取一个字段,之后T2更新了该字段,T1在此读取该字段值发生了变化。
    • 幻读:T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后T1在此读取该表会多出几行。

    A:原子操作  

    C:一致性   和数据正确性有关。

    i:隔离性  select会用到隔离性,和并发有关。

    D:持久性  commit自动保证持久性。

    数据库事务的特性:原子性、一致性、隔离性、持久性

    • 原子性:事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行,这种特性称为原子性。(简单地说就是,几个对于数据库的操作要么全执行,要么全不执行,即同时成功起作用或同时失败没影响)
    • 一致性:事务一致性值得是在一个事务执行之前和执行之后数据库都必须处于一致性状态(中途是否一致不用管),这种特性称为一致性。(如果数据库的状态满足所有的完整性约束,就说该数据库是一致的。一致性处理数据库中对所有语义的保护。如:客户K1要向客户K2转账,K1账户减少的金额就是K2账户增加的金额,在转账之前K1和K2账户的金额之和与转账之后K1和K2账户的金额之和是一样的,在转账期间可能不满足这种一致性,但事务前后是数据库数据是一致的)
    • 隔离性:隔离性指的是并发的事务是相互隔离的。(一个事务内部的操作及正在操作的数据必须封装起来,不被其它企图进行修改的事务看到)
    • 持久性:持久性指当系统或介质发生故障时,确保已提交的更新不能丢失。(一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,可以经受任何系统故障,持久性通过数据库备份和恢复来保证)

    首先做的是:选择数据库的隔离级别和提交模式

    3、单用户首先选择并发控制模型(悲观性控制模型和乐观性控制模型)和数据库的隔离级别

    悲观性控制模型:一个锁定系统,可以阻止用户以影响其他用户的方式修改数据。如果用户执行的操作导致应用了某个锁,只有这个锁的所有者释放该锁,其他用户才能执行与该锁冲突的操作。这种方法之所以称为悲观并发控制,是因为它主要用于数据争用激烈的环境中,以及发生并发冲突时用锁保护数据的成本低于回滚事务的成本的环境中。 

    乐观性控制模型:用户读取数据时不锁定数据。当一个用户更新数据时,系统将进行检查,查看该用户读取数据后其他用户是否又更改了该数据。如果其他用户更新了数据,将产生一个错误。一般情况下,收到错误信息的用户将回滚事务并重新开始。这种方法之所以称为乐观并发控制,是由于它主要在以下环境中使用:数据争用不大且偶尔回滚事务的成本低于读取数据时锁定数据的成本。

    4、Oracle数据库多用户并发控制

    客户端:原始行(也即是乐观性控制模型)

    服务器端:1,显示锁,不推荐使用。2,选择数据库的隔离级别(隐时锁)3,多版本

    update delete insert——必定加排它锁

    select——隔离级别

    sql server和Oracle默认隔离级别为:读已提交数据

    MySQL默认隔离级别:可重复读

    共享锁 ShareLock

    共享锁又称为读锁。即读取操作时创建的锁。其他用户可以并发的读取数据。
    若事务T对数据A加上共享锁,则事务T只能读A; 其他事务也只能对数据A加共享锁,而不能加排它锁,直到事务T释放A上的S锁。

    这就保证了其他事务可以读A,但是在事务T释放A上的共享锁之前,不能对A做任何修改。

    排它锁 ExclusiveLock

    若事务T对数据对象A加上排它锁,则只允许T读取和修改数据A,其他任何事务都不能再对A加任何类型的锁,直到事务T释放X锁。

    它可以防止其他事务获取资源上的锁,直到事务末尾释放锁

    共享锁和排它锁的区别

    1. 如果事务T对数据A加上共享锁,则其他事务只能对A再加共享锁,不能加排它锁。只有事务T可以对A进行读取和修改,其他事务只能读取数据而不能修改数据
    2. 如果事务T对数据A加上排它锁,只有事务T可以对A进行读取和修改,其他任何事务都不能对A进行读取和修改

    5、并发冲突。现在网站用的就是乐观式并发冲突,不加锁。

    用法:while解决的,分为原始行和当前行,内存中放入两条数据:原始行和当前行,

    框架会自动解决高并发问题。

    MySQL0,sql server靠加锁:

    MySQL2,MySQL3,Oracle不加锁,靠多版本:select,后台保留版本,牺牲内存,只读已经提交的数据。读写不存在依赖。

  • 相关阅读:
    CI框架(Codeigniter)总结
    ssh自动下载SFTP文件
    数据库设计原则
    Java代码性能优化的 39个细节
    quartz定时任务时间设置
    Myeclipse 反编译工具插件
    Maven -- 使用Myeclipse创建Maven项目
    详解Java Web项目启动执行顺序
    java web项目下的lib和build path 中jar包问题解惑
    java读取存在src目录下和存在同级目录下的配置文件
  • 原文地址:https://www.cnblogs.com/lyxcode/p/11457914.html
Copyright © 2011-2022 走看看