当前位置: 首页 > news >正文

网站建设预算及准备展览制作设计公司

网站建设预算及准备,展览制作设计公司,网络工程主要学什么就业方向,惠州的服装网站建设转载自 独占锁、共享锁、更新锁#xff0c;乐观锁、悲观锁 1、锁的两种分类方式 #xff08;1#xff09;从数据库系统的角度来看#xff0c;锁分为以下三种类型#xff1a; 独占锁#xff08;Exclusive Lock#xff09; 独占锁锁定的资源只允许进行锁定操作的…转载自   独占锁、共享锁、更新锁乐观锁、悲观锁 1、锁的两种分类方式 1从数据库系统的角度来看锁分为以下三种类型 独占锁Exclusive Lock       独占锁锁定的资源只允许进行锁定操作的程序使用其它任何对它的操作均不会被接受。执行数据更新命令即INSERT、 UPDATE 或DELETE 命令时SQL Server 会自动使用独占锁。但当对象上有其它锁存在时无法对其加独占锁。独占锁一直到事务结束才能被释放。  共享锁Shared Lock       共享锁锁定的资源可以被其它用户读取但其它用户不能修改它。在SELECT 命令执行时SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后共享锁就会立即被释放。  更新锁Update Lock       更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时它首先对数据对象作更新锁锁定这样数据将不能被修改但可以读取。等到SQL Server 确定要进行更新数据操作时它会自动将更新锁换为独占锁。但当对象上有其它锁存在时无法对其作更新锁锁定。 2从程序员的角度看锁分为以下两种类型 悲观锁Pessimistic Lock       悲观锁正如其名它指的是对数据被外界包括本系统当前的其他事务以及来自外部系统的事务处理修改持保守态度因此在整个数据处理过程中将数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制也只有数据库层提供的锁机制才能真正保证数据访问的排他性否则即使在本系统中实现了加锁机制也无法保证外部系统不会修改数据。 乐观锁Optimistic Lock       相对悲观锁而言乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销特别是对长事务而言这样的开销往往无法承受。       而乐观锁机制在一定程度上解决了这个问题。乐观锁大多是基于数据版本 Version 记录机制实现。何谓数据版本即为数据增加一个版本标识在基于数据库表的版本解决方案中一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时将此版本号一同读出之后更新时对此版本号加一。此时将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对如果提交的数据版本号大于数据库表当前版本号则予以更新否则认为是过期数据。 2、数据库中如何使用锁 首先从悲观锁开始说。在SqlServer等其余很多数据库中数据的锁定通常采用页级锁的方式也就是说对一张表内的数据是一种串行化的更新插入机制在任何时间同一张表只会插1条数据别的想插入的数据要等到这一条数据插完以后才能依次插入。带来的后果就是性能的降低在多用户并发访问的时候当对一张表进行频繁操作时会发现响应效率很低数据库经常处于一种假死状态。而Oracle用的是行级锁只是对想锁定的数据才进行锁定其余的数据不相干所以在对Oracle表中并发插数据的时候基本上不会有任何影响。 注对于悲观锁是针对并发的可能性比较大而一般在我们的应用中用乐观锁足以。 Oracle的悲观锁需要利用一条现有的连接分成两种方式从SQL语句的区别来看就是一种是for update一种是for update nowait的形式。 比如我们看一个例子。首先建立测试用的数据库表 CREATE TABLE TEST(ID,NAME,LOCATION,VALUE,CONSTRAINT test_pk PRIMARY KEY(ID))AS SELECT deptno, dname, loc, 1 FROM scott.dept 这里我们利用了Oracle的Sample的scott用户的表把数据copy到我们的test表中。 1for update 形式介绍 然后我们看一下for update锁定方式。我们执行如下的select for update语句 select * from test where id 10 for update 通过这条检索语句锁定以后再开另外一个sql*plus窗口进行操作再把上面这条sql语句执行一便你会发现sqlplus好像死在那里了好像检索不到数据的样子但是也不返回任何结果就属于卡在那里的感觉。这个时候是什么原因呢就是一开始的第一个Session中的select for update语句把数据锁定住了。由于这里锁定的机制是wait的状态(只要不表示nowait那就是wait)所以第二个Session(也就是卡住的那个sql*plus)中当前这个检索就处于等待状态。当第一个session最后commit或者rollback之后第二个session中的检索结果就是自动跳出来并且也把数据锁定住。 不过如果你第二个session中你的检索语句如下所示select * from test where id 10也就是没有for update这种锁定数据的语句的话就不会造成阻塞了。 2for update nowait 形式介绍 另外一种情况就是当数据库数据被锁定的时候也就是执行刚才for update那条sql以后我们在另外一个session中执行for update nowait后又是什么样呢。 比如如下的sql语句: select * from test where id 10 for update nowait 由于这条语句中是制定采用nowait方式来进行检索所以当发现数据被别的session锁定中的时候就会迅速返回ORA-00054错误内容是资源正忙, 但指定以 NOWAIT 方式获取资源。所以在程序中我们可以采用nowait方式迅速判断当前数据是否被锁定中如果锁定中的话就要采取相应的业务措施进行处理。 那这里另外一个问题就是当我们锁定住数据的时候我们对数据进行更新和删除的话会是什么样呢。 比如同样我们让第一个Session锁定住id10的那条数据我们在第二个session中执行如下语句 update test set value2 where id 10 这个时候我们发现update语句就好像select for update语句一样也停住卡在这里当你第一个session放开锁定以后update才能正常运行。当你update运行后数据又被你update 语句锁定住了这个时候只要你update后还没有commit别的session照样不能对数据进行锁定更新等等。 总之Oracle中的悲观锁就是利用Oracle的Connection对数据进行锁定。在Oracle中用这种行级锁带来的性能损失是很小的只是要注意程序逻辑不要给你一不小心搞成死锁了就好。而且由于数据的及时锁定在数据提交时候就不呼出现冲突可以省去很多恼人的数据冲突处理。缺点就是你必须要始终有一条数据库连接就是说在整个锁定到最后放开锁的过程中你的数据库联接要始终保持住。 与悲观锁相对的我们有了乐观锁。乐观锁一开始也说了就是一开始假设不会造成数据冲突在最后提交的时候再进行数据冲突检测。 在乐观锁中我们有3种常用的做法来实现 a. 在数据取得的时候把整个数据都copy到应用中在进行提交的时候比对当前数据库中的数据和开始的时候更新前取得的数据。     当发现两个数据一模一样以后就表示没有冲突可以提交否则则是并发冲突需要去用业务逻辑进行解决。 b. 乐观锁的做法就是采用版本戳这个在Hibernate中得到了使用。     采用版本戳的话首先需要在你有乐观锁的数据库table上建立一个新的column比如为number型当你数据每更新一次的时候版本数就会往上增加1。     比如同样有2个session同样对某条数据进行操作。两者都取到当前的数据的版本号为1当第一个session进行数据更新后在提交的时候查看到当前数据的版本还为1和自己一开始取到的版本相同。就正式提交然后把版本号增加1这个时候当前数据的版本为2。当第二个session也更新了数据提交的时候发现数据库中版本为2和一开始这个session取到的版本号不一致就知道别人更新过此条数据这个时候再进行业务处理比如整个Transaction都Rollback等等操作。     在用版本戳的时候可以在应用程序侧使用版本戳的验证也可以在数据库侧采用Trigger(触发器)来进行验证。不过数据库的Trigger的性能开销还是比较的大所以能在应用侧进行验证的话还是推荐不用Trigger。 c. 第三种做法和第二种做法有点类似就是也新增一个Table的Column不过这次这个column是采用timestamp型存储数据最后更新的时间。     在Oracle9i以后可以采用新的数据类型也就是timestamp with time zone类型来做时间戳。这种Timestamp的数据精度在Oracle的时间类型中是最高的精确到微秒(还没与到纳秒的级别)一般来说加上数据库处理时间和人的思考动作时间微秒级别是非常非常够了其实只要精确到毫秒甚至秒都应该没有什么问题。     和刚才的版本戳类似也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比如果一致则OK否则就是版本冲突。如果不想把代码写在程序中或者由于别的原因无法把代码写在现有的程序中也可以把这个时间戳乐观锁逻辑写在Trigger或者存储过程中。
http://www.pierceye.com/news/874238/

相关文章:

  • 旅游网站建设国内外现状辽阳专业建设网站公司
  • 免费视频模板网站wordpress不写代码
  • 设计网站公司 露 联湖南岚鸿小程序网站开发公司
  • 聊城网站设计seo公司重庆
  • 网站布局技术厦门网站建设680元
  • 深圳物流公司网站建e网怎么做效果图
  • 做营销网站公司建个个人网站一年多少钱
  • 阆中网站网站建设代理网络服务器
  • 企业网站新模式seo排名推广工具
  • 山东做网站三五个人网页设计作品简单
  • 福州网站建设软件网站做了301怎么查看跳转前网站
  • 网站开发竞品分析网站开发与规划
  • 香山红叶建设有限公司网站网络营销方式落后的表现
  • 合肥百姓网网站建设263云通信官方网站
  • 深圳建设网站seo 手机电商数据分析师
  • 网站内外链怎么做公司建设包括哪些方面
  • 织梦网站环境搭建电子邮件怎么注册
  • 企业营销类专业网站app设计尺寸规范
  • 奈曼旗建设局网站建设旅游门户网站
  • 网站设计一般会遇到哪些问题wordpress文章关闭缩略图
  • 优质东莞网站制作公司thinkphp网站源码下载
  • 公司网站做一下多少钱最吉利旺财的公司名字
  • 网站建设维护及使用管理办法营销策划的步骤
  • 优秀网站设计案例在家开个人工作室违法吗
  • 腾讯云建设网站wordpress仿知乎社区
  • 《网站开发技术》模板linchong.wordpress
  • 找做企业网站论文旅游网站建设
  • 类似情侣空间的网站开发seo外推软件
  • 网站建设策划方案怎么写工业品网络营销
  • 上海本地网站建设微信网站怎么建设