不锁怕出事,锁了又怕锁死了!!! 数据库由于数据存储速度快,数据稳定,结构化的特性,被广泛用作数据存储,并成为最重要,最常见的方式! 数据库从20世纪50年代诞生伊始,就因为支持事务的特性得到大力的发展,最终各种数据库诸如oracle,Sybase,mysql等关系型数据库百花齐放,既然数据库是因为事务而生,那么事务的特性又是哪些呢?简而言之就是ACID(原子性,一致性,隔离性,持久性)! 而为了保持数据的一致性,数据库都有了一个操作叫做加锁!有表级锁,行级锁,页面锁! 死锁就是说两个线程在争同一个资源,然后互不相让,导致锁死的情况(比如两个人从两端走上独木桥,然后卡死在桥中间)! 回到问题本身,数据库在什么时候会产生死锁呢? 1,情况一:我中有你,你中有我! 事务一:两个操作update A;update B; 事务二:两个操作update B;update A; 线程一执行事务一到一半的时候,锁了A想要获得B的锁,与此同时事务二执行到了锁B,想要获得锁A的时候,因为互相都想要对方拥有的锁,而导致死锁! 2,情况二:吃着碗里的,看着锅里的! A线程先查询了一条记录(使用了共享锁),与此同时B线程正要修改这条记录(使用了独占锁),然后A线程突然想修改这条记录了,怎么办呢?升级锁。。而B线程想要降级为共享锁,必须要等到A线程释放掉共享锁,这样就形成了死锁! 可以看到这个过程中是A占着共享锁想要升级,B占着独占锁想要降级,然后卡死! 3,牵一发而动全身! 一个表结构,必须要有适当的索引等优化手段,如果在执行事务的时候,没有加索引条件甚至没有任何条件,那么将执行全表扫描,如果是多个事务在操作,很容易就发生了阻塞和死锁!所以字段加索引非常重要!! 可以说数据库死锁必然会造成很严重的生产事故,所以要尽量避免死锁的发生,而如何避免呢?我会在后面的回答中逐一解答,敬请关注。。。 |
|
来自: 昵称11935121 > 《未命名》