共享锁

AQS深入理解与实战----基于JDK1.8

独自空忆成欢 提交于 2020-01-05 18:50:52
要介绍AQS,首先要介绍“同步器”的概念。 同步器 是一种抽象数据类型,在该类型的内部,维护了以下内容: 1.一个状态变量,该变量的不同取值可以表征不同的同步状态语义(例如表示一个锁已经被线程持有了还是没有任何线程持有); 2.能够更新和检查该状态变量值的操作(方法)集合; 3.至少有一个方法——当同步状态的值需要时可调用该方法阻塞来修改该状态的线程;或当其他的线程修改了同步状态值,可允许调用该方法唤醒其他阻塞线程 简单说,同步器中包含一个 可表征同步状态的变量 , 可操作该变量的方法集 ,以及 可阻塞或唤醒其他来修改该状态的线程的方法集 。 互斥锁,读写锁,信号量,屏障,事件指示器等等都是同步器。 AQS,全称是AbstractQueuedSynchronizer,中文译为 抽象队列式同步器 。这个抽象类对于JUC并发包非常重要,JUC包中的ReentrantLock,,Semaphore,ReentrantReadWriteLock,CountDownLatch等等几乎所有的类都是基于AQS实现的。 “抽象”是说该类是一个 抽象类, “队列式同步器”是说AQS使用 队列来 管理多个抢占资源的线程 。AQS在其内部实现了上面所说的同步器的三要素,而且它会把抢占资源失败的线程放入自己内部的一个队列当中维护起来,在这个队列内部的线程会排队等待获取线程。

Sqlserver事务锁级别详记

依然范特西╮ 提交于 2020-01-04 22:45:37
在数据库开发过程中,不得不考虑并发性的问题,因为很有可能当别人正在更新表中记录时,你又从该表中读数据,那你读出来的数据有可能就不是你希望得到的数据。可以说有些数据同时只能有一个事物去更新,否则最终显示给用户的数据不是数据库中现存的数据。锁表就限制不同的事物在同一时间内不允许同时操作一张表,实例很简单,可以用select来锁定整张表,那别人就不可能更新或是读取表的记录。 select * from dbo.Employee with(holdlock); with关键字来设置锁表的方式。下面是with括号内关键字的书名:  NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。 HOLDLOCK(保持锁) 此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。 UPDLOCK(修改锁) 此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。 TABLOCK(表锁) 此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。

要想写好“增删改查”,你必须知道的MySQL InnoDB相关知识

此生再无相见时 提交于 2020-01-03 05:34:34
要想写好“增删改查”,你必须知道的MySQL InnoDB相关知识 MySQL InnoDB 锁的类型 共享锁(SLock) 排他锁(XLock) 读的类型 一致性非锁定读(快照读) 一致性锁定读(当前读) 事务的隔离级别 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 事务的并发问题 脏读 不可重复读 丢失更新 MySQL InnoDB MySQL InnoDB是最常用的MySQL数据库引擎,作为一个后端程序员,必须对它有所了解。这篇博客的相关内容是参考《MySQL技术内幕 InnoDB存储引擎》第2版 锁的类型 共享锁(SLock) 共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。SQL语句:SELECT … LOCK IN SHARE MODE 排他锁(XLock) 允许事务删除或更新一行数据。排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁,包括共享锁和排他锁。获取排他锁的事务是可以对一行数据读取和修改。SQL语句:SELECT FOR UPDATE 读的类型 一致性非锁定读(快照读) 如果读取的行正在执行delete或update操作,这时读取操作不会因此去等待行上的锁释放,而是去读取一个快照数据

J.U.C并发工具类

你。 提交于 2019-12-30 02:50:26
目录 目标 CountDownLatch Semaphore CyclicBarrier Runnable和Callable fork/join并发处理框架 目标 并发工具类:CountDownLatch Fork/Join的使用 Futrue的使用 CountDownLatch 倒计数器。共享锁。由AQS共享锁实现。 countDown();-》倒计数器减一,并阻塞。 await();当countDown();为0时唤醒所有线程。 使用场景:希望n个线程同时执行某一操作。 基本使用 /* 没隔1s开启一个线程,共开启6个线程 若希望6个线程 同时 执行某一操作 可以用CountDownLatch实现 */ public static void test01 ( ) throws InterruptedException { CountDownLatch ctl = new CountDownLatch ( 6 ) ; for ( int i = 0 ; i < 6 ; i ++ ) { new Thread ( ) { @Override public void run ( ) { ctl . countDown ( ) ; try { ctl . await ( ) ; System . out . println ( "here I am..." ) ; } catch (

SQL Server事务的隔离级别和锁

落爺英雄遲暮 提交于 2019-12-29 03:03:53
背景 当用户并发尝试访问同一数据的时,SQL Server尝试用锁来隔离不一致的数据和使用隔离级别查询数据时控制一致性(数据该如何读取),说起锁就会联想到事务,事务是一个工作单元,包括查询/更新数据和数据定义。 锁 锁类型 在SQL Server中,根据资源的不同,锁分为以下三种类型: 行锁:是SQL Server中数据级别中粒度最小的锁级别,行锁根据表是否存在聚集索引,分为键值锁和标识锁 页锁:针对某个数据页添加的锁,在T-SQL语句中,使用了页锁就不会在使用相同类型的行锁,反之依然,在对数据页加锁后,无法在对其添加不兼容的锁 表锁:添加表锁则无法添加与其不兼容的页å锁和行锁 锁模式 共享锁(S):发生在数据查找之前,多个事务的共享锁之间可以共存 排他锁(X):发生在数据更新之前,排他锁是一个独占锁,与其他锁都不兼容 更新锁(U):发生在更新语句中,更新锁用来查找数据,当查找的数据不是要更新的数据时转化为S锁,当是要更新的数据时转化为X锁 意向锁:发生在较低粒度级别的资源获取之前,表示对该资源下低粒度的资源添加对应的锁,意向锁有分为:意向共享锁(IS) ,意向排他锁(IX),意向更新锁(IU),共享意向排他锁(SIX),共享意向更新锁(SIU),更新意向排他锁(UIX) 共享锁/排他锁/更新锁一般作用在较低级别上,例如数据行或数据页,意向锁一般作用在较高的级别上,例如数据表或数据

SQLite 剖析

人走茶凉 提交于 2019-12-29 03:01:50
由于sqlite对多进程操作支持效果不太理想,在项目中,为了避免频繁读写 文件数据库带来的性能损耗,我们可以采用操作sqlite内存数据库,并将内存数据库定时同步到文件数据库中的方法。 实现思路如下: 1、创建文件数据库; 2、创建内存数据库(文件数据库、内存数据库的内部表结构需要一致); 3、在内存数据库中attach文件数据库,这样可以保证文件数据库中的内容在内存数据库中可见; 4、对于insert、select操作,在内存数据库中完成,对于delete、update操作,需要同时访问内存、文件数据库; 5、定时将内存数据库中的内容flush到文件数据库。 一、内存数据库: 在SQLite中,数据库通常是存储在磁盘文件中的。然而在有些情况下,我们可以让数据库始终驻留在内存中。最常用的一种方式是在调用sqlite3_open()的时候,数据库文件名参数传递":memory:",如: rc = sqlite3_open(" :memory: ", &db); 在调用完以上函数后,不会有任何磁盘文件被生成,取而代之的是,一个新的数据库在纯内存中被成功创建了。由于没有持久化,该数据库在当前数据库连接被关闭后就会立刻消失。需要注意的是,尽管多个数据库连接都可以通过上面的方法创建内存数据库,然而它们却是不同的数据库,相互之间没有任何关系。事实上

乐观锁与悲观锁

拥有回忆 提交于 2019-12-26 12:23:23
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。 典型的冲突有: l 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。 l 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。 并发控制机制 最常用的处理多用户并发访问的方法是加锁。当一个用户锁住数据库中的某个对象时,其他用户就不能再访问该对象。加锁对并发访问的影响体现在锁的粒度上。比如,放在一个表上的锁限制对整个表的并发访问;放在数据页上的锁限制了对整个数据页的访问;放在行上的锁只限制对该行的并发访问。可见行锁粒度最小,并发访问最好,页锁粒度最大,表锁介于2者之间。 悲观锁:假定会发生并发冲突, 屏蔽一切可能违反数据完整性的操作。[1] 悲观锁假定其他用户企图访问或者改变你正在访问、更改的对象的概率是很高的,因此在悲观锁的环境中,在你开始改变此对象之前就将该对象锁住,并且直到你提交了所作的更改之后才释放锁。悲观的缺陷是不论是页锁还是行锁,加锁的时间可能会很长,这样可能会长时间的限制其他用户的访问,也就是说悲观锁的并发访问性不好。 乐观锁:假设不会发生并发冲突, 只在提交操作时检查是否违反数据完整性。[1]

事务的隔离性

只愿长相守 提交于 2019-12-25 00:01:10
一、锁 1、锁的概述 InnoDB存储引擎中,事务的隔离性主要是由锁机制实现的。开发多用户的应用,很大的一个难点就在于并发访问:一方面既要最大程度地实现数据库的并发访问,另一方面又要确保每个用户能以一致的方式读取、修改数据,为此,我们需要锁机制。 锁机制是数据库系统区别于文件系统的另一个关键特性,锁机制用于管理对共享资源的并发访问,保证数据的完整性和一致性。这里的共享资源不仅仅是行数据,还包括缓冲池中的LRU列表,删除、添加、移动LRU列表中的元素时,有需要锁来保证一致性。 2、锁的类型 (1)共享/排他锁 MySQL提供了两种锁的粒度:行级锁、表级锁。一般而言,锁的粒度越小,并发度越高;锁用得越多,开销越大(锁的各种操作如获取锁、释放锁、检查锁状态等都会增加系统开销)。因此我们通常只锁定尽可能少的数据量,另外我们需要在锁开销和并发度之间找好平衡点。 InnoDB存储引擎提供两种行级锁: 共享锁(S Lock):允许事务读一行数据; 排他锁(X Lock):允许事务删除或更新一行数据。 如果事务T1已经获得行r的共享锁,那么事务T2可以立即获得行r的共享锁以读取数据(锁兼容);如果事务T1已经获得行r的共享锁/排他锁,那么事务T2要想获得行r的排他锁/共享锁或排他锁必须等待事务T1释放锁(锁不兼容)。共享锁和排他锁均用在事务中,随着事务的结束而释放。 (2)意向锁

MySQL 锁的小结

泄露秘密 提交于 2019-12-24 02:54:41
摘自:https://www.cnblogs.com/protected/p/6526857.html 关于数据库的各种锁的总结: 1.共享锁(又称读锁)、排它锁(又称写锁): InnoDB引擎的锁机制: InnoDB支持事务,支持行锁和表锁用的比较多,Myisam不支持事务,只支持表锁。 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。 意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。 意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。 说明: 1)共享锁和排他锁都是行锁,意向锁都是表锁,应用中我们只会使用到共享锁和排他锁,意向锁是mysql内部使用的,不需要用户干预。 2)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁,事务可以通过以下语句显示给记录集加共享锁或排他锁。 共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。 排他锁(X):SELECT * FROM table_name

mysql死锁学习第一篇

╄→гoц情女王★ 提交于 2019-12-24 00:39:13
文章目录 前言 日志 划重点 insert导致死锁原因排查 gap锁在insert里面起到作用 前言 技术群早上有个兄台发了一个死锁的日志,我瞄了一眼,发现插入也会死锁,好奇让人变得更强大。 日志 看下那位老哥的日志 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2019-12-20 04:00:03 0x7f78e455e700 *** (1) TRANSACTION: TRANSACTION 3460338, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1 MySQL thread id 2011281, OS thread handle 140156593497856, query id 29253160 10.105.232.16 DBopr update insert into TABLE_NAME ( IS_DELETED, CREATOR, MODIFIER, GMT_MODIFIED, GMT_CREATE, POLICY_NO, INS