事务死锁

来源:互联网 发布:从入门到精通 linux 编辑:程序博客网 时间:2024/05/04 17:37

并发的几个事务同时发生,不加锁控制的话数据就会乱套了,而加了锁后,又是并发访问会出现死锁,所以就会出现避免死锁的一些措施。 首先谈并发:理论指的是在一段时间同时对某件事进行操作。 注意精度问题,修改数据库是在一段时间内操作,不是在某个时刻,而日志则会从 时刻 开始记录你的操作。 造成死锁的原因是为了防止 不同的用户同时间(不是时刻)都对某个数据修改,造成访问不一致的问题。 比如你读了数据库的一个数据然后把它修改了并存回去,是需要时间的(假如是student表中的有个grade属性,你改了一条记录的一个值)在这个过程当中,有人又访问了数据库并且恰恰访问的是存回去之前的数据,然后他要进行操作,过了一段时间,此时你已经存回去了数据。会发现原来的数据被改动了。这时数据就乱套了。(专业术语叫读脏数据,其实还有很多其他类似这种导致前后数据不一致的问题)所以为了限定这种操作,数据库设计了-----锁---来锁定这种操作。就是你正在操作某个数据的时候----通常之前会先锁定这个数据,这样别人就不能对此数据操作了(严格来说就是只能读,不能改),必须等你操作完才能对此数据修改等操作,这就在一定程度上避免了前后操作数据不一致的问题。 但是有了锁后,新问题出现了,就是死锁: 简单解释死锁:进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待就形成死锁 官方解释死锁 死锁,根本原因在于对共享存储区的访问。在数据库中也一样,如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。 在并发控制中,锁是非常重要的。 至于在Oracle还是别的数据库管理系统中,死锁产生的原因没有不同,不同的顶多是锁的实现或者死锁的恢复等罢了 再来说说事务: 事务简单来说就是 一系列的对数据库的操作揉在一起,要么同时完成,要么就都不完成。 比如---你要取钱的过程就可以当成是一个小的事务: 插卡,输入取钱金额,取走钱,拿出来卡。此过程缺一不可。把所有这些过程细节封装起来就成为一个事务。 以oracle数据库为例: 一个事务(你可以认为是一系列业务的操作)起始于dml语句(insert、update、delete) 即一条dml语句就做为一个事务的起始,然后根据业务需要,进行其他的dml操作都算是事务的一部分。 最后碰到commit。或者rollback,或者其他意外什么的都算作一个事务的结束。 整个过程就是一个事务。 事务的理论解释就是那四个什么特性:什么原子性、一致性、隔离性和持久性 简称ACID 剩下的:数据库是建立在操作系统之上的一个层次。 你问的是数据库的存储机制??工作机制??还是什么的?? 数据库就是存数据的。数据库管理系统是 对存的数据进行高效率的管理 大的结构分物理数据跟逻辑数据。 物理数据就是数据在存储设备上的存储方式,什么物理联系,物理结构,物理记录等 术语。 逻辑数据就是程序员和用户看到的数据形式。什么逻辑联系,逻辑结构==同上 数据库管理类系统就是把这些逻辑跟物理相互转换。 好比你输入的叫逻辑数据存储在磁盘上叫物理数据。等等。

原创粉丝点击