当前位置:首页 » 存储配置 » 存储过程加锁怎么防止并发

存储过程加锁怎么防止并发

发布时间: 2023-09-03 20:48:17

数据库死锁,并发问题

补充楼主:
其实我没什么经验,只不过是了解一些基础的东西罢了。
一楼的 一朵瘩红花 实际经验很丰富,你可以向她咨询一下。

你问的问题挺好得。三个概念紧密联系在一起。
这样说吧:并发的几个事务同时发生,不加锁控制的话数据就会乱套了,而加了锁后,又是并发访问会出现死锁,所以就会出现避免死锁的一些措施。
首先谈并发:理论指的是在一段时间同时对某件事进行操作。 注意精度问题,修改数据库是在一段时间内操作,不是在某个时刻,而日志则会从 时刻 开始记录你的操作。

造成死锁的原因是为了防止 不同的用户同时间(不是时刻)都对某个数据修改,造成访问不一致的问题。
比如你读了数据库的一个数据然后把它修改了并存回去,是需要时间的(假如是student表中的有个grade属性,你改了一条记录的一个值)在这个过程当中,有人又访问了数据库并且恰恰访问的是存回去之前的数据,然后他要进行操作,过了一段时间,此时你已经存回去了数据。会发现原来的数据被改动了。这时数据就乱套了。(专业术语叫读脏数据,其实还有很多其他类似这种导致前后数据不一致的问题)所以为了限定这种操作,数据库设计了-----锁---来锁定这种操作。就是你正在操作某个数据的时候----通常之前会先锁定这个数据,这样别人就不能对此数据操作了(严格来说就是只能读,不能改),必须等你操作完才能对此数据修改等操作,这就在一定程度上避免了前后操作数据不一致的问题。

但是有了锁后,新问题出现了,就是死锁:

简单解释死锁:进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待就形成死锁

官方解释死锁
死锁,根本原因在于对共享存储区的访问。在数据库中也一样,如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。

在并发控制中,锁是非常重要的。
至于在Oracle还是别的数据库管理系统中,死锁产生的原因没有不同,不同的顶多是锁的实现或者死锁的恢复等罢了

再来说说事务:
事务简单来说就是 一系列的对数据库的操作揉在一起,要么同时完成,要么就都不完成。
比如---你要取钱的过程就可以当成是一个小的事务: 插卡,输入取钱金额,取走钱,拿出来卡。此过程缺一不可。把所有这些过程细节封装起来就成为一个事务。
以oracle数据库为例:
一个事务(你可以认为是一系列业务的操作)起始于dml语句(insert、update、delete)
即一条dml语句就做为一个事务的起始,然后根据业务需要,进行其他的dml操作都算是事务的一部分。
最后碰到commit。或者rollback,或者其他意外什么的都算作一个事务的结束。
整个过程就是一个事务。
事务的理论解释就是那四个什么特性:什么原子性、一致性、隔离性和持久性
简称ACID

剩下的:数据库是建立在操作系统之上的一个层次。
你问的是数据库的存储机制??工作机制??还是什么的??
数据库就是存数据的。数据库管理系统是 对存的数据进行高效率的管理
大的结构分物理数据跟逻辑数据。
物理数据就是数据在存储设备上的存储方式,什么物理联系,物理结构,物理记录等 术语。
逻辑数据就是程序员和用户看到的数据形式。什么逻辑联系,逻辑结构==同上
数据库管理类系统就是把这些逻辑跟物理相互转换。 好比你输入的叫逻辑数据存储在磁盘上叫物理数据。等等。

废话了一堆,也不知道回答对你的问题没~~

java防止并发的几种方法

使用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为最新值

⑶ 存储过程并发,存储过程在同一个时间里面执行了多次,导致数据多次修改

这个问题显然不应该去数据库查,你最先应该看前端是否有重复提交的限制,或者直接在后台加安全锁。

⑷ java处理高并发时,使用synchronized代码锁防止同时对数据库某一数据的问题。

首先synchronized不可能做到对某条数据库的数据加锁。它能做到的只是对象锁。
比如数据表table_a中coloum_b的数据是临界数据,也就是你说的要保持一致的数据。你可以定义一个类,该类中定义两个方法read()和write()(注意,所有有关该临界资源的操作都定义在这个类中),再定义一个静态变量作为锁就可以了。

public static final String LOCK = "table_a_b_lock";

public int read(){
synchronized LOCK{
System.out.println("read data...");
}
}

public void write(String data){
synchronized LOCK{
System.out.println("write data:" + data);
}
}

另外,还可以在数据库级别加上锁。数据库本来就支持不同的隔离级别。

热点内容
编译器咋用 发布:2025-08-28 14:29:03 浏览:688
新闻访问类型 发布:2025-08-28 14:22:25 浏览:937
从零基础学习编程 发布:2025-08-28 13:57:34 浏览:381
数据库在国外 发布:2025-08-28 13:42:53 浏览:891
androiddialog创建 发布:2025-08-28 13:09:26 浏览:950
初级服务器是指什么 发布:2025-08-28 13:08:39 浏览:100
微软dns服务器地址 发布:2025-08-28 13:07:20 浏览:607
2013款荣放顶配有哪些配置 发布:2025-08-28 13:05:32 浏览:667
dedecmssql注入漏洞 发布:2025-08-28 12:54:27 浏览:397
dash官网搭建服务器 发布:2025-08-28 12:45:17 浏览:746