- 浏览: 943449 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (385)
- 搜索引擎学习 (62)
- 算法 (1)
- 数据库 (15)
- web开发 (38)
- solr开发 (17)
- nutch 1.2 系统学习 (8)
- cms (1)
- 系统架构 (11)
- linux 与 unix 编程 (16)
- android (15)
- maven (1)
- 关注物流 (1)
- 网址收集 (1)
- 分布式,集群 (1)
- mysql (5)
- apache (1)
- 资料文档备份 (7)
- 上班有感 (0)
- 工作流 (15)
- javascript (1)
- weblogic (1)
- eclipse 集成 (1)
- JMS (7)
- Hibernate (1)
- 性能测试 (1)
- spring (6)
- 缓存cache (1)
- mongodb (2)
- webservice (1)
- HTML5 COCOS2D-HTML5 (1)
- BrowserQuest (2)
最新评论
-
avi9111:
内陷到android, ios, winphone里面也是随便 ...
【HTML5游戏开发】二次开发 BrowserQuest 第一集 -
avi9111:
呵呵,做不下去了吧,没有第二集了吧,游戏是个深坑,谨慎进入,其 ...
【HTML5游戏开发】二次开发 BrowserQuest 第一集 -
excaliburace:
方案3亲测完全可用,顺便解决了我其他方面的一些疑问,非常感谢
spring security 2添加用户验证码 -
yuanliangding:
Spring太强大了。
Spring Data JPA 简单介绍 -
小高你好:
什么是hibernate懒加载?什么时候用懒加载?为什么要用懒加载?
1、事务
事务是指作为单个逻辑工作单元执行的一系列操作。
事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单
元,可以简化错误恢复并使应用程序更加可靠。数据库服务器保证在事务范围内执行的操作完整且正确地提交至磁盘,否则数据库会复原至事务启动之前的状态。
数据库在读取的记录上加共享锁,验证是否可以读取数据,直到事务提交,锁才能释放,其他用户可以读取数据,但是不能修改。可以保证在同一事务中前后两次读
取记录是一致的。当必须要信任所有读取的记录,保证记录不被修改,我们可以采用repeatable
read,例如统计数据(银行账号的余额情况)、关联查询多个表等。 相对Committed Read而言,提高了并发量和系统的吞吐量。可以通过ONCONFIG参数设置为隔离级别:USELASTCOMMITTED。表需要设置为行级锁,不能是页级锁。
一个逻辑工作单元要成为事务,必须满足所谓的ACID属性。ACID的具体含义如下:
1)A(Atomicity):操作序列要么完整的执行,否则什么都不做;
2)C(Consistency):一致性,事务执行后,保证数据库从一个一致性状态到另外一个一致性状态;
3)I(Isolation):隔离,一个事务的中间状态对其他事务不可见,即每个用户都感觉他们在单独使用数据库。隔离级别用来定义多大程度的隔离多个不同的事务;
4)D(Durability):持久性,事务的有效性,不会应用硬件或软件的失败而丢失。
2、并发控制
1)相关概念
i)隔离(+一致性) => 并发控制;
ii)多个事务可以访问或修改相同的资源;
iii)只要多个进程共享资源,就需要对访问进程进行排队控制;
iv)在进行并发控制时,数据库内部将生成多个并发事务访问资源的操作序列表,并且每一个事务内部的各个操作都需要序列化。
2)串行调度存在的问题
在串行调度中,采用操作序列,一个事务完成了再完成另外一个,即使两个事务T1、T2更新的是数据库中不同的对象。此种方式从并发和性能角度考虑,都不能很好的利用计算机资源。
为了改善性能,需要采用非串行调度,即允许事务并发执行,即一个事务内的操作可以在其他事务提交前开始执行。
3)并发调度的常见问题
i)脏读:事务T2读取到了事务T1没有提交的结果
例如如下的操作序列会导致脏读:
事务T1读取记录,然后更新记录;
事务T2读取了更新后的记录;
若T1后续操作失败,会导致更新的记录回滚,而同时事务T2已经使用了这个没有提交的值。
ii)不可重复读:事务T1中多个读操作返回不同的结果
事务T1读取一个对象;
事务T2读取并更新同一个对象;
事务T1再次读取同一个对象返回了不同的值。
iii)幻影读:如果事务T1在同样的情况下多次执行select读取的结果不同
事务T1从一个表中检索满足特定条件的记录返回m条记录;
事务T2往该表中insert/delete其他满足相同条件的记录;
事务T1再次以相同的条件检索该表的数据返回的数据记录不为m条。
3、锁机制
1)相关概念
i)用户可以锁定一个对象,可以防止 其它用户修改锁定的对象;
ii)在多个用户并发访问数据库的情况下,为保证数据完整性,锁是很有必要的;
iii)程序可以显式的对数据枷锁,数据库系统可以隐式的对对象进行加锁。
2)锁的类型
i)共享锁(Shared locks)
:多个用户可以读取相同的记录
如果一个对象上没有排他锁,则共享锁可以加在该对象上,它可以防止其他事务更新数据,但同时,其他事务可以读取该数据,多个事务可以在同一个对象上加多个共享锁。
ii)排他锁(Exclusive locks)
:同一时间仅仅有一个用户可以读取相同的记录
如果一个对象上没有任何锁,排他锁才可以加在该对象上。一旦在记录上加了排他锁,则不能在该记录上增加任何锁了,直至锁释放。它可以防止其他事务读取和更新数据。
iii)提升/更新锁(Promotable/Update lock)
:可以对锁进行升级或者降级
在更新游标时使用,由游标在含有“for update”选项执行时产生,只能在没有排他锁或其他更新锁的记录上加更新锁。当锁定的记录真正执行的时候,更新锁将提升为排他锁。
iv)专一锁(Intent lock)
:是一种表级锁,标识在该表上有一个游标在读取数据
由IDS自动分配,如果一条记录上的记录被更新,一个排他锁将分配在该记录上,同时将该记录的表上自动加上专一锁,这能保证没有session可以在该表上增加排他锁,只要该表中有记录被增加了排他锁。
3)锁的有效期
i)程序可以控制数据库锁的有效期;
ii)当数据库关闭后,数据库锁将被释放;
iii)根据数据库使用了事务的情况,表锁的有效期不同。如果数据没有使用事务(没有使用事务日志,也不使用commit work语句),显式对一个表lock,当执行unload table时,锁将被释放;
iv)当数据库使用了事务,事务结束时,将释放事务所有的锁。
4)不同粒度的锁
i)数据库级别的锁
:数据库管理活动,比如imports和exports。例如:
创建排他锁实例:
iv)行级锁
:OLTP事务采用行级锁效率高。创建表时指定为行级锁的参考语句如下:
i)如果更新表中相对较小一部分数据的时候,采用行级锁将获取最好的性能,如果一个事务只访问表中的一小部分数据,那就采用行级锁。
ii)如果一个事务频繁访问整个表中的数据,设置更粗的力度,比如表级锁;
iii)如果更新数据库中大部分表的大部分数据的情况下,采用数据库级别的锁;
iv)informix默认的锁模式为页级锁。
v)ONCONFIG参数DEF_TABLE_LOCKMODE用于设置默认锁模式;
vi)查看表锁模式的方法如下:
方法1:
1)Dirty Read(脏读)
设置为Dirty Read隔离级别的参考语句如下:
静态表(没有更新,只读的表),速度比100%准备更重要的情况,以及不能等待锁的释放的情况中。
2)Commited Read(只读已提交的数据)
设置为该级别的参考语句如下:
在读取数据前,数据库服务器尝试在记录上加共享锁。加锁前,需要先检查是否可以对对象加共享锁;如果可以加锁,则要保证要加锁的记录没有其他进程正在更新;当继续正在更新时,记录上有排他锁,此时我们不能对记录加共享锁。
3)Cursor Stability(游标稳定性)
参考设置语句如下:
4)Repeatable Read(可重复读)
参考设置语句如下:
5)Last Committed Read(读取最后提交的数据)
这是一种乐观锁,它解决了Commited Read的不足,因为Commited Read在记录被锁时,其它进程需要等待。
这种隔离级别常被用在WEB应用系统中,例如在电子商务系统中,可以选择商品添加到购物篮中,但是此时后台可能你正在对商品的价格进行更新,当再次检查的时候,可能发现商品的价格已经发生变化。
设置语句参考如下:
6)几种隔离级别的比较
隔离级别 脏读? 不可重复读? 幻影读?
Dirty Read Yes Yes Yes
Last Commited Read No Yes Yes
Commited Read No Yes Yes
Cursor Stability No No Yes
Repeatable Read No No No
5、设置事务/会话的锁模式
1)不等待锁的释放
为默认的锁模式,如果数据库对象被锁,则立即返回错误。错误消息参考如下:
•
107
: ISAM error: record
is
locked
一个事务可能发生死锁或挂住,等待资源的释放。设置为此种模式的语句如下:
直到等待n秒后,如果锁一直没有释放将返回锁等待超时错误信息。参考设置语句如下:
1)监控session的隔离级别
使用: onstat –g sql 或者 onstat –g ses,例如在笔者测试服务器上运行onstat -g sql,运行结果如下:
Sess SQL
Current
Iso Lock SQL ISAM F.E.
Id Stmt type
Database
Lvl Mode ERR ERR Vers Explain
880
-
sdp CR Wait
20
0
0
9.03
Off
878
SELECT
sdp CR
Not
Wait
0
0
9.03
Off
877
-
sdp CR Wait
20
0
0
9.03
Off
756
-
sdp CR Wait
20
0
0
9.03
Off
755
-
sdp CR Wait
20
0
0
9.03
Off
754
-
sdp CR Wait
20
0
0
9.03
Off
753
-
sdp CR Wait
20
0
0
9.03
Off
752
sdp CR Wait
20
0
0
9.03
Off
751
-
sdp CR Wait
20
0
0
9.03
Off
750
-
sdp CR Wait
20
0
0
9.03
Off
480
-
sdp CR Wait
20
0
0
9.03
Off
479
-
sdp CR Wait
20
0
0
9.03
Off
478
-
sdp CR Wait
20
0
0
9.03
Off
477
-
sdp CR Wait
20
0
0
9.03
Off
476
-
sdp CR Wait
20
0
0
9.03
Off
475
-
sdp CR Wait
20
0
0
9.03
Off
474
-
sdp CR Wait
20
0
0
9.03
Off
473
-
sdp CR Wait
20
0
0
9.03
Off
472
-
sdp CR Wait
20
0
0
9.03
Off
471
-
sdp CR Wait
20
0
0
9.03
Off
470
-
sdp CR Wait
20
0
0
9.03
Off
469
-
sdp CR Wait
20
0
0
9.03
Off
468
-
sdp CR Wait
20
0
0
9.03
Off
467
-
sdp CR Wait
20
0
0
9.03
Off
466
-
sdp CR Wait
20
0
0
9.03
Off
465
-
sdp CR Wait
20
-
232
0
9.03
Off
464
-
sdp CR Wait
20
0
0
9.03
Off
463
-
sdp CR Wait
20
0
0
9.03
Off
43
-
sdp CR Wait
20
0
0
9.03
Off
40
-
sdp CR Wait
20
0
0
9.03
Off
Id Stmt type
Database
Lvl Mode ERR ERR Vers Explain
878
-
sdp CR Wait
20
0
0
9.03
Off
Last parsed SQL statement :
select
count
(
*
)
from
2)查看用户进程锁等待情况
使用: onstat –u。
3)查看锁使用和等待情况
使用: onstat -k
4)监控数据库事务及其状态
使用: onstat -x
发表评论
-
informix 写的存储过程
2012-04-01 16:23 1875CREATE PROCEDURE informix.remov ... -
用MySQL-Proxy实现读写分离【转】
2011-10-14 15:32 1242MySQL-Proxy, 6月份发布的MySQL-Proxy是 ... -
分布式数据库拆表拆库的常用策略
2011-10-12 18:21 1019分布式数据库拆表拆库 ... -
【转】 MYSQL 时间查询的范围
2011-09-09 23:31 1779对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描 ... -
mongodb 的安装使用
2011-01-25 10:21 1561安装 OS X 32-bit ... -
linux 数据库安装
2009-12-17 21:36 32001、查看要求的安装包(和RHEL4有点小区别)rpm -q b ... -
oracle 10g 数据库 导入
2009-10-06 17:21 1844今天,把公司的数据库导出了,通过pl/sql导出来了,格式为 ... -
Oracle创建表空间、创建用户以及授权、查看权限
2009-10-06 15:55 1232创建临时表空间CREATE TEMPORARY TA ... -
产品分类设计
2009-09-20 00:02 1119网页树形结构问题的一种解决办法 在一个标准的树形 ... -
linux 操作 oracle
2009-08-20 14:58 1487linux 连接oracle [test@local ... -
linux 数据库导入 从windows一个用户导出,由系统dba导入
2009-07-31 09:08 1818linux下导入:进入linux下 ... -
oracle 日期处理
2009-06-08 14:35 1794oracle当月、当年、本周数据 当月数据 ... -
接触oracle存储过程
2009-06-04 16:16 1195这是我写的第一个存储 ... -
oracle 10g 数据库数据导入dmp
2009-05-25 21:25 1711今天从公司服务器里把数据导出来.本想导进自己的电脑里,弄了半天 ...
相关推荐
关于处理informix并发问题的几点心得,通过实例来描述在编写ec程序过程中,如何解决并发问题的经验和技巧.
informix锁查看和解锁,可以借鉴一下,有参考意义,还不错
INFORMIX的资料太难找了,自己整理了一些,包括: 1、INFORMIX函数大全.pdf...3、informix的事务、并发控制、锁机制、隔离级别.docx 4、oracle和informix的基础区别.docx 5、Shell脚本和Informix的交互实现技巧.docx
informix 锁表处理,锁表时获取详细的会话信息来锁定锁表的原因
INFORMIX有三种不同类型的锁。它们在不同的情况下使用。 1. SHARED锁 SHARED锁只保留对象的可读性。当锁存在时,对象不能改变。多个程序可对同个对象加SHARED锁。 2. EXCLUSIVE锁 只能使单个程序使用。在...
如何解决informix数据库锁表问题.doc
有些Informix客户经常会遇到长事务的情况,通常在online.log会发现有不同的关于长事务的警告信息,如何区分这些不同的长事务类型,从而采取不同的方法去处理
使用Irdormix数据库服务器的用户,可能经常遇到这样的情况...经过检查,结果发现是某一个数据库表被锁,导致自己的程序被阻塞,直到镇被解除后,程序才能 继续运行。本文针对此类问题,介绍查找和定位冲突锁的具体方法
INFORMIX使用锁技术解决在多用户访问数据库情况下,对同一对象访问的并发控制问题。INFORMIX 支持复杂的、可伸缩性的锁技术。
informix linux.unix平台下常用字符集转换
informix数据库 informix解锁问题 informix性能,空间监控,计算单条数据大小 在数据库服务器上行 执行 dbaccess sysmaster systermastertest.sql 就可看见 数据库当前空间使用比例
INFORMIX安装INFORMIX安装INFORMIX安装
数据转换(oracle,mysql,informix,sqlserver)(函数,处理过程)
NULL 博文链接:https://areshowl.iteye.com/blog/735552
1 引言 在关系数据库(DB2,Oracle,Sybase,Informix和SQL Server)最小的恢复和交易单位为一个事务(Transactions),事务具有ACID(原子性,一致性,隔离性和永久性)特征。关系数据库为了确保并发用户在存取同一...
informix考题
作为一个集成解决方案,它被定位为作为IBM在线事务处理(OLTP)旗舰级数据服务系统。 IBM对Informix和DB2都有长远的规划,两个数据库产品互相吸取对方的技术优势。在2005年早些时候,IBM推出了Informix Dynamic ...
关于informix锁技术的一些文章的整理
第二章 INFORMIX 数据库系统概述 5 2.1 INFORMIX-ONLINE 联机数据库. 5 2.2 INFORMIX-SQL 数据库操纵语言. 5 2.3 INFORMIX-ISQL 数据库操纵工具. 5 2.4 INFORMIX-ESQL/C 数据库编程语言. 6 第三章 INFORMIX-ONLINE ...
- 快速容错服务器,可以进行联机事务处理方面的应用(INFORMIX-OnLine) - 低维护服务器,适用于中、小规模的应用环境(INFORMIX-SE) Informix工具可以运行于绝大多数的主流操作系统,包括UNIX、DOS、Macintosh、OS/2...