2、调用sql对数据库修改本身是自动上锁的。
如果要保证程序逻辑的一致性需要使用事务。
3、比如主键递增这种情况,或者只要是有主键。
4、程序无论用什么方式,都不可能在数据库中插入两条主键相同的记录。
5、同时多人使用,是否包括一种情况:同时多人修改(包括删除)。如果仅仅是同时多人添加,那么毫无问题。不会有并发问题
6、如果存在同时多人修改的可能性的话,那就需要用“开放式并发”或“非开放式并发”。
7、开放式并发”相对简单。即:一个人修改并提交,被告知原始数据已被修改,则报错自己找找这方面资料吧,VS与.NET已经集成了一些简单实现的方法。
锁述的概一. 为什么要引入锁
多个用户同时对数据库的并发 *** 作时会带来以下数据不一致的问题:
丢失更新
A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统
脏读
A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致
不可重复读
A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致
并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些 *** 作以避免产生数据不一致
二 锁的分类
锁的类别有两种分法:
1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁
MS-SQL Server 使用以下资源锁模式。
锁模式 描述
共享 (S) 用于不更改或不更新数据的 *** 作(只读 *** 作),如 SELECT 语句。
更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
排它 (X) 用于数据修改 *** 作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。
架构锁 在执行依赖于表架构的 *** 作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。
大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。
使用synchronized关键字3种使用方法:
修饰类方法,作用于当前实例加锁,进入方法要获取当前实例的锁
修饰静态方法,作用于当前实例加锁,进入方法要获取当前实例的锁
修饰代码块,指定加锁对象,给指定对象加锁,进入代码块要先获取指定对象的锁(synchronized参数要传入固定的对象才能起到作用)
使用原子 *** 作:
java 在 SDK atomic包下的提供了原子 *** 作的类,常用的有
AtomicBoolean
AtomicInteger
AtomicIntegerArray
AtomicIntegerFieldUpdater
AtomicLong
AtomicLongArray
AtomicLongfieldUpdater
AtomicMarkableReference
AtomicReference
AtomicReference
AtomicReferenceArray
AtomicReferenceFieldUpdater
AtomicStampedReference
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder
Striped64
其中atomicboolean atomicinteger atomicreperence常用的方法及含义
get() 获取当前值
set()设置当前值
getAndSet(V newValue) 获取当前值并设置最新的值
compareAndSer(V expect,V update)如果expect与当前值相同就设置update为最新值
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)