数据库锁定机制 ,规范化 ,事务机制总结

来源:互联网 发布:华为linux驱动工程师 编辑:程序博客网 时间:2024/05/16 23:38

 之前整理了一些基本概念 现在来研究一下高端的概念吧

1.事物

事物是并行调度的基本单位

事物的并发控制,可能面对的问题

 

1.丢失修改

2.不可重复读

3.读“脏数据”

 

在jdbc中  每次 update delete insert 都被作为一次隐式的事务来处理,具体锁定机制由数据库来实现,如果不现实的关闭自动提交那么每次语句都是作为一个隐式事物来提交,所以开始事物的时候必须要做的就是关闭自动提交。

 

现在我们来看一下JDBC给我们提供的接口

几个不同的级别 并给出了上面问题的例子。

 

TRANSACTION_NONE

static final int TRANSACTION_NONE
指示事务不受支持的常量。

 

TRANSACTION_READ_UNCOMMITTED

static final int TRANSACTION_READ_UNCOMMITTED
指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。此级别允许由某一事务更改的行在已提交该行中的所有更改之前被另一个事务读取(“脏读”)。如果所有更改都被回滚,则第二个事务将检索无效的行。

TRANSACTION_READ_COMMITTED

static final int TRANSACTION_READ_COMMITTED
指示防止发生脏读的常量;不可重复读和虚读有可能发生。此级别只禁止事务读取其中带有未提交更改的行。

TRANSACTION_READ_COMMITTED

static final int TRANSACTION_READ_COMMITTED
指示防止发生脏读的常量;不可重复读和虚读有可能发生。此级别只禁止事务读取其中带有未提交更改的行。

TRANSACTION_REPEATABLE_READ

static final int TRANSACTION_REPEATABLE_READ
指示防止发生脏读和不可重复读的常量;虚读有可能发生。此级别禁止事务读取其中带有未提交更改的行,它还禁止这种情况:一个事务读取某一行,而另一个事务更改该行,第一个事务重新读取该行,并在第二次读取时获得不同的值(“不可重复读”)。
 

 

2.预防死锁  

 

  两个方法

一次封锁

顺序封锁

大都在业务层处理

 

死锁处理 一般是小事物回滚

3.串行化调度

 

遵守两次封锁协议是可串行化的充分条件

 

4.封锁

意向锁:如果对一个节点加意向锁,则说明该节点的下层正在被加锁,对任意节点加锁时,必须先对它的上层节点加锁。

 

锁的相容性表 就不给出了,查相容性表就可以查出此次操作是否可以执行。

 

5.悲观锁定和乐观锁定

 

悲观锁定是基于数据库的锁定机制实现的

乐观锁定则是自己控制的

 

对于 selec...for update 给出一个urlhttp://blog.sina.com.cn/s/blog_5d41e6d90100b8up.html

 

乐观锁定是开发人员自行在业务系统实现的,一般都是基于版本号的

具体就不详细说了。

 

不过可以考虑这样一个问题

 

在做数据库的排他竞合的时候总会在数据表中增加一个冗余字段。版本号啦,时间戳啦,用这些冗余来做数据的更新竞合判断,防止并发时数据的丢失。
但是只用这种乐观锁来做也会有问题:就是说,在同一时间两个用户同时修改一个数据,恰恰同时的来判断时间戳(版本号)相同与否,当然因为都是原始数据,都会同事通过检验,然后就会出严重的问题,数据的丢失-第一个进行update的人的数据就被后面的人给蒸发掉了。我曾试图在程序中用同步来控制,但是发现效果不是很好,并且影响框架的结构,造成混乱,不优雅,也不便捷(因为需要改的地方实在很多)。

 

解决方案

用for update,做悲观锁,突然明白了。可以在检查时间戳(版本号)的时候用悲观锁锁定,锁定后别人是无法在通过for update 读出数据的。阻塞了别人的验证,自己的验证通过后,提交,然后解锁。解锁后,其他人取得修改后的数据,判断时间戳(版本号)不通过,于是就在数据库曾解决了极端并发的这个问题。并且由于验证时间戳(版本号)到提交的间隔非常小(锁定的时间近似等于提交的时间与间隔时间之和),并不会对数据库的并发产生额外的巨大影响。可以说是一个较好的解决方案。

 



6. 规范化知识

1NF  数据库字段必须持有原子的值或者原始的类型,而且表必须有主键。第一范式防止冗余行的存在。

2NF 符合1NF 并且所有的字段依赖所有的主键,字段,以致这一依赖不能在减少 

3NF 符合2NF ,所有非主键字段单独依赖于候选键,并且不依赖于任何非键字段

BC-NF 符合3NF ,只有唯一的作为决定因素的候选码

 

 

7.领域模型与关系模式 的映射范式

吃了饭再写