精通Hibernate——数据库系统锁的基本原理

news/2024/6/29 11:56:41 标签: hibernate, , 原理

的基本原理如下:
1、当一个事务访问某种数据库资源时,如果执行select语句,必须先获得共享,如果执行insert、update或delete语句,必须先获得独占,这些用于定被操纵的资源
2、当第二个事务也访问相同的资源时,如果执行select语句,也必须先获得共享,如果执行insert、update或delete语句,也必须先获得独占。此时根据已经放置在资源上的类型,来决定第二个事务应该等待第一个事务解除对资源的定还是立即获得
如果资源上没有,第二个读事务立即获得共享,如果第二个事务是写事务,则立即获得独占
如果资源上有共享,第二个读事务立即获得共享,如果第二个事务是写事务,则需要等待第一个事务解除共享
如果资源上有独占,第二个事务无论是读还是写,都必须等待第一个事务释放独占
数据库中的可以分为以下几种:
数据库级、表级、区域级、页面级定数据库特定页面)、键值级定数据库表中带有索引的一行数据)、行级
数据库中的粒度会自动升级,例如:当一个事务中的较多,达到升级的门限时,系统自动将行级和页面级升级为表级
按照封的程度可以分为 共享、独占、更新
共享
允许其他事务读取定的数据,但是不允许其他事务修改和删除
当一个事务select之后就把对应的数据加上了共享,在默认情况,当数据被读取后,数据库立即解除共享,如果数据资源上配置了共享,还能再配置共享和更新。他的并发性能良好,能支持多个事务读相同的数据,每个事务都能获得一把共享
独占
又名排他,适用于修改数据场合,他定的数据不允许其他事务读取和修改
当一个事务insert、update、delete之后,数据库系统会自动对sql操纵的数据添加独占,独占一直到事务结束才会解除,独占不和其他兼容,如果已经配置了独占不能再添加其他。同理,如果一个资源已经有其他,就不能添加独占。并发性能比较差。
更新
更新在更新阶段用户定将要被更新的数据,这可以避免使用共享造成的死。例如:

update account set balance = 900 where id = 1;

如果使用共享,更新步骤如下:
1、获得一个共享,读取id=1的数据
2、将共享升级为独占,再执行更新操作
如果有两个或多个事务同时更新,他们同时将共享升级为独占,由于独占不兼容其他,因此每个事务都进入等待状态,等待其他事务释放,这就造成了死
更新具有以下特征
当一个事务执行update时,数据库系统先为事务分配一把更新,当读取完毕执行更新操作时,会把更新升级为独占
由于更新与共享兼容,但是一个资源最多只能放一把更新,当多个事务同时更新相同数据时,只有一个事务能获得更新,然后再把更新升级为独占,其他事务必须等到事务结束才能更新,这样避免了死

下面说下以及防止方法
数据库死是多个事务分别定一个资源,又试图请求定对方已经定的资源,例如,如果以下两个事务并发,就会产生死
事务1

1.begin;
2.update customer set name = 'tom' where id = 1;
3.update orders set order_number = 'tom_001' where id = 1;

事务2

4.begin;
5.update orders set order_number = 'jack_001' where id = 1;
6.update customer set name = 'jack' where id = 1;

第一个事务当执行到第2行时,对id=1的customer加上了独占,此时,第二个事务执行到了第6行,对id=1的orders加上了独占;当第一个事务继续执行到第3行,发现id=1的orders已经被第二个事务加上了独占,因此,第一个事务会等待第二个事务释放该,当第二个事务执行到第6行时发现id=1的customer被一个事务加上了独占,他会等待第一个事务释放该,这样就形成两个事务一直再等待对方提交事务而释放,从而造成了死
许多数据库能够定期自动搜索和处理死问题,当检测到死时,系统将结束死优先级最低的事务,并且撤销该事务。
防止方法
1、合理安排表的访问顺序
2、使用短事务
3、如果对数据的一致性要求不是很高,可以允许脏读,即:不需要对数据加
4、如果可能的话,错开多个事务访问相同资源的数据


http://www.niftyadmin.cn/n/1454703.html

相关文章

精通Hibernate——应用程序中的悲观锁和乐观锁

当数据库采用read commited隔离级别时,会导致不可重复读和第二类丢失更新的并发问题。可以使用悲观锁或者乐观锁来避免这类问题 悲观锁:在应用程序中显式的为数据资源加锁,悲观锁假定当前事务操纵数据资源时,肯定还会有其他事务同…

uva 10105 - Polynomial Coefficients(多项式系数)

题目连接:uva 10105 - Polynomial Coefficients 题目大意:给出n和m,再该出m个数值n1 ~ nm, 保证n1 ... nm n,现在有算式(a1 a2 ... am) ^ n, 求展开项中a1^n1 a2^n2 ... am^nm这项的系数。 解题思路…

Linux下C语言编程基础 —— Makefile

在Linux下编程,最好最快的进入方式就是赶紧实际操作一遍,工具而已嘛,多多实践,熟能生巧。这不是 Hello, world编写好了,怎么边编译执行阿????还是现学学 makefile 怎么编…

AS3.0中的反射

1、反射就是通过一个字符串得到一个Class然后根据这个Class得到实例。 2、例子:现在假设有100种动物(Animal),它们都继承自Animal类,这时候你需要实例化随机选择的一种动物,如果你不用反射,就要…

精通Hibernate——Hibernate缓存详解

Session的缓存时内置的,不能被卸载,称为Hibernate的一级缓存,SessionFactory有一个内置缓存和一个外置缓存,其中外置缓存时可插拔的缓存插件,级为Hibernate二级缓存。第二级缓存本身实现很复杂,必须实现并发…

高性能Mysql——创建高性能的索引

一、索引基础 select first_name from actor where id 5; 如果在id上建有索引,则Mysql将使用该索引找到id5的列,也就是说Mysql先在索引上按值进行查找,然后返回符合条件的所有数据。 索引可以包含一个或者多个列的值。如果索引包含多个列…

uva 10491 - Cows and Cars(概率)

题目连接:uva 10491 - Cows and Cars 题目大意:给出a,b和c,表示有a b 个门, a个后面是牛, b个后面是车, 然后你从中选一个门,之后有一个知情人帮你打开c个后面是牛的门(…

FLEX中使用BitmapFill的source属性指定SVG类文件

FLEX中使用BitmapFill的source属性指定SVG类文件 <?xml version"1.0" encoding"utf-8"?><mx:Application xmlns:mx"http://www.adobe.com/2006/mxml" layout"absolute" backgroundGradientColors"[#33…