android并发控制 并发控制算法_数据

概念

并发控制机制就是要用正确的方式调度并发操作,使用户的一个事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。
并发控制的主要技术有:封锁,时间戳,乐观控制法和多版本并发控制(MVCC)。
给每个事务盖上一个“时标” 通过时间戳来解决事务的冲突问题。
CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。解决ABA问题可以通过CAS + 版本号。

并发控制带来的问题

  1. 丢失修改:两个事务同时读入数据并提交修改,T2的提交结果破坏了T1的提交结果,导致了T1的修改被丢失。
  2. 不可重复读:T1读取某一数据的时候,T2对数据进行修改,等到T1再次去读取该数据的时候,得到与前一次不同的值。
  3. 读“脏”数据:T1修改某一数据并将其写回磁盘,事务T2读取同一数据后,T1由于某些原因被撤销,T2的数据就与数据库中的数据不一致。“脏”数据即不正确的数据。
  4. 幻读:一个事务在前后两次查询同一范围的时候,后一次查询看到了前一次查询没有看到的行。

封锁

封锁是悲观锁,是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是加锁机制会降低系统的效率。
所谓封锁就是事务T在对某个数据对象进行操作之前,先向系统发出请求,对其加锁。
基本的封锁类型有两种:排他锁(X锁),共享锁(S锁)
一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
二级封锁协议:在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,读完后即可释放锁。(防止丢失修改,防止"脏"数据)
三级封锁协议:在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。(防止丢失修改,防止"脏"数据,解决不可重复读)

可串行化

多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务的结果相同,称这种调度策略为可串行化调度。可串行化是并发事务正确调度的准则。

两段锁

用来实现并发调度的可串行性,保证调度的正确性。
两阶段锁协议:
所谓两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁:

  1. 对任何数据进行读,写操作之前,必须要先申请并获得对该数据的封锁。
  2. 在释放一个封锁后,事务不能再申请和获得其他任何封锁。
    第一阶段:扩展阶段,允许事务申请锁,但是不允许释放锁。
    第二阶段:收缩阶段,允许事务释放锁,但是不允许申请锁。
    并发执行的事务均遵循两阶段协议,则对事务的任何并发调度策略都是可以串形化的。
    两段锁协议并没有把用的数据全部加锁,因此遵循两阶段协议的事务可能发生死锁。

MVCC

MVCC是指在数据库中通过维护多个数据对象的多个版本信息来实现高效并发控制的一种策略。