如何对行 表 数据库加锁

如何对行 表 数据库加锁
如何对行 表 数据库加锁

如何对行表数据库加锁

1如何锁一个表的某一行

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT*FROM table ROWLOCK WHERE id =1

2锁定数据库的一个表

SELECT*FROM table WITH (HOLDLOCK)

加锁语句:

sybase:

update表set col1=col1 where1=0 ;

MSSQL:

select col1 from表(tablockx) where1=0 ;

oracle:

LOCK TABLE表IN EXCLUSIVE MODE ;

加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁

几个例子帮助大家加深印象

设table1(A,B,C)

A B C

a1 b1 c1

a2 b2 c2

a3 b3 c3

1)排它锁

新建两个连接

在第一个连接中执行以下语句

begin tran

update table1

set A='aa'

where B='b2'

waitfor delay '00:00:30'--等待30秒

commit tran

在第二个连接中执行以下语句

begin tran

select*from table1

where B='b2'

commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒

2)共享锁

在第一个连接中执行以下语句

begin tran

select*from table1 holdlock-holdlock人为加锁

where B='b2'

waitfor delay '00:00:30'--等待30秒

commit tran

在第二个连接中执行以下语句

begin tran

select A,C from table1

where B='b2'

update table1

set A='aa'

where B='b2'

commit tran

若同时执行上述两个语句,则第二个连接中的select查询可以执行

而update必须等待第一个事务释放共享锁转为排它锁后才能执行即要等待30秒

3)死锁

增设table2(D,E)

D E

d1 e1

d2 e2

在第一个连接中执行以下语句

begin tran

update table1

set A='aa'

where B='b2'

waitfor delay '00:00:30'

update table2

set D='d5'

where E='e1'

commit tran

在第二个连接中执行以下语句

begin tran

update table2

set D='d5'

where E='e1'

waitfor delay '00:00:10'

update table1

set A='aa'

where B='b2'

commit tran

同时执行,系统会检测出死锁,并中止进程

补充一点:

Sql Server2000支持的表级锁定提示

HOLDLOCK持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别

NOLOCK 语句执行时不发出共享锁,允许脏读,等于READ UNCOMMITTED事务隔离级别

PAGLOCK 在使用一个表锁的地方用多个页锁

READPAST 让sql server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁

ROWLOCK 强制使用行锁

TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表

UPLOCK 强制在读表时使用更新而不用共享锁

应用程序锁:

应用程序锁就是客户端代码生成的锁,而不是sql server本身生成的锁

处理应用程序锁的两个过程

sp_getapplock锁定应用程序资源

sp_releaseapplock为应用程序资源解锁

注意: 锁定数据库的一个表的区别

SELECT*FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除

SELECT*FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除

1如何锁一个表的某一行

/*

测试环境:windows 2K server + Mssql 2000

所有功能都进行测试过,并有相应的结果集,如果有什么疑义在论坛跟帖

关于版权的说明:部分资料来自互联网,如有不当请联系版主,版主会在第一时间处理。

功能:sql遍历文件夹下的文本文件名,当然你修改部分代码后可以完成各种文件的列表。

*/

A 连接中执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select*from tablename with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

update tablename set colname='10'where id=3--则要等待5秒

update tablename set colname='10'where id <>3--可立即执行

2锁定数据库的一个表

SELECT*FROM table WITH (HOLDLOCK)

注意: 锁定数据库的一个表的区别

SELECT*FROM table WITH (HOLDLOCK)

其他事务可以读取表,但不能更新删除

SELECT*FROM table WITH (TABLOCKX)

其他事务不能读取表,更新和删除

ACCESS数据库锁定问题

ACCESS数据库锁定问题 问题1 单位网站突然有的时候不能打开网页。重启电脑后问题解决。说是CONN.ASP第6行错误。同时生成一个.LDB文件。在网上查了下说是数据库没有关闭或锁定了。请问如何关闭啊,下边是CONN.ASP代码: <% starttime=timer() StrSQL="DBQ="+server.mappath("admin/data/news30000.mdb")+";DRIVER={Microsoft Access Driver (*.mdb)};" 'connstr="driver={SQL Server};server=(local);database=master;uid=sa;pwd=;" set conn=server.createobject("ADODB.CONNECTION") conn.open StrSQL(第6行) %> 答: 如果是ACCESS数据库,应该是并发访问造成的问题。因为ACCESS没有行锁。所以你有个一个用户在网上改一条数据,另外一个用户再上来访问相同一条数据时就给锁了。重启动后所有的连接全断开了,所以就没问题了。如果有可能最好不用ACCESS做后台数据库。 ---------------------------------- 问题2 我的数据库老是被锁住,网页打不开,请高手帮忙!!我的conn.asp是:<% scadb=mydata&"datahotel/#@@##feel.mdb" 'mydata 为各文件中设置的路径,请不要改动 connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&scadb&"") On Error Resume Next Set conn = Server.CreateObject("ADODB.Connection") conn.open connstr If Err Then err.Clear Set Conn = Nothing Response.Write "




数据库连接出错!!!请检查数据库连接指向^--^
" Response.End End If%> 答: 你的数据库连接写法是正确的,是不是数据库太大,几百M的话容易出现这个问题,建议换sql数据库。不想换的话可以把数据库下载到本地压缩修复一下再传上去。 ------------------------- 问题3

数据库锁表与解锁

数据库锁表与解锁 一、mysql 锁定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…] 解锁表:UNLOCK TABLES 例子: LOCK TABLES table1 WRITE ,table2 READ 、、、更多表枷锁; 说明:1、READ 锁代表其她用户只能读不能其她操作 2、WRITE锁代表:其她用户不能任何操作(包括读) 查瞧那些表被锁:show OPEN TABLES where In_use > 0; 全局加锁:FLUSH TABLES WITH READ LOCK(这个命令就是全局读锁定,执行了命令之后所有库所有表都被锁定只读。解锁也就是:UNLOCK TABLES ) 二、oracle --行级锁定(同样对 mysql起作用) 通过 :select * from tableName t for update 或 select * from tableName t where id =1 for update 前者锁定整个表,后者多顶 id=1的一行数据(有主键,并且指定主键=值的只 锁定指定行) 说明:通过 select 、、、 for update 后其她用户只能读不能其她操作,锁定者通过 commit或 rollback命令自动解锁,或使用本文的解锁方式

(will)! --表级锁定 lock table in mode [nowait] 其中: lock_mode 就是锁定模式 nowait关键字用于防止无限期的等待其她用户释放锁 五种模式如下(1到5 级别越来越高,限制越来越大): 1、行共享(row share,rs):允许其她用户访问与锁定该表,但就是禁止排她锁定 整个表 2、排她锁(row exclusive ,rx):与行共享模式相同,同时禁止其她用户在此表上使用共享锁。使用select 、、、 for update语句会在表上自动应用行排她锁 3、共享(share ,s):共享锁将锁定表,仅允许其她用户查询表中的行,但不允许插入、更新、删除行。多个用户可以在同一表中放置共享锁,即允许资源共享,,因此得名“共享锁”。例如:如果用户每天都需要在结账时更新日销售额表,则可以在更新该表时使用共享锁以确保数据的一致性。 4、共享排她锁(share row exclusive,srx):执行比共享锁更多的限制。防止其 她事务在表上应用共享锁,、共享排她锁以及排她锁。 5、排她(exclusive,x):对表执行最大的限制。除了允许其她用户查询该表记录, 排她锁防止其她事务对表做任何更改或在表上应用任何类型的锁。 实例: lock table table_Name in exclusive mode; 要解锁需要锁定人执行 commit 或 rollback 或者用本文的解锁方式 (will)! --查询锁表 SELECT /*+ rule */ S、USERNAME, DECODE(L、TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,

数据库死锁问题总结

数据库死锁问题总结 1、死锁(Deadlock) 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造 成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系 统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力 协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象 死锁。一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每 个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记 录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发 生了死锁现象。计算机系统中,如果系统的资源分配策略不当,更常见的可能是 程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。 锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协 议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。(回滚 一个,让另一个进程顺利进行) 产生死锁的原因主要是: (1)系统资源不足。 (2)进程运行推进的顺序不合适。 (3)资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能 性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序 与速度不同,也可能产生死锁。 产生死锁的四个必要条件: (1)互斥条件:一个资源每次只能被一个进程使用。 (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 破解:静态分配(分配全部资源) (3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 破解:可剥夺 (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 破解:有序分配 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。 死锁的预防和解除:

Oracle查看被锁定的表和行的SQL

我们在操作数据库的时候,有时候会由于操作不当引起数据库表被锁定,这么我们经常不知所措,不知怎么给这些表解锁,在pl/sql Developer工具的的菜单“tools”里面的“sessions”可以查询现在存在的会话,但是我们很难找到那个会话被锁定了,想找到所以被锁的会话就 更难了,下面这叫查询语句可以查询出所以被锁的会话。如下: SELECT https://www.360docs.net/doc/147566366.html,ername, m.SID,sn.SERIAL#, m.TYPE, DECODE (m.lmode, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', lmode, LTRIM (TO_CHAR (lmode, '990')) ) lmode, DECODE (m.request, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.',

6, 'Exclusive', request, LTRIM (TO_CHAR (m.request, '990')) ) request, m.id1, m.id2 FROM v$session sn, v$lock m WHERE (sn.SID = m.SID AND m.request != 0) OR ( sn.SID = m.SID AND m.request = 0 AND lmode != 4 AND (id1, id2) IN ( SELECT s.id1, s.id2 FROM v$lock s WHERE request != 0 AND s.id1 = m.id1 AND s.id2 = m.id2) )ORDER BY id1, id2, m.request; 通过以上查询知道了sid和SERIAL#就可以开杀了 alter system kill session 'sid,SERIAL#';

如何对行 表 数据库加锁

如何对行表数据库加锁 1如何锁一个表的某一行 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT*FROM table ROWLOCK WHERE id =1 2锁定数据库的一个表 SELECT*FROM table WITH (HOLDLOCK) 加锁语句: sybase: update表set col1=col1 where1=0 ; MSSQL: select col1 from表(tablockx) where1=0 ; oracle: LOCK TABLE表IN EXCLUSIVE MODE ; 加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁 几个例子帮助大家加深印象 设table1(A,B,C) A B C a1 b1 c1 a2 b2 c2 a3 b3 c3 1)排它锁 新建两个连接 在第一个连接中执行以下语句 begin tran update table1 set A='aa' where B='b2' waitfor delay '00:00:30'--等待30秒 commit tran 在第二个连接中执行以下语句 begin tran select*from table1 where B='b2' commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒 2)共享锁 在第一个连接中执行以下语句 begin tran select*from table1 holdlock-holdlock人为加锁 where B='b2' waitfor delay '00:00:30'--等待30秒 commit tran 在第二个连接中执行以下语句 begin tran select A,C from table1 where B='b2' update table1 set A='aa' where B='b2' commit tran 若同时执行上述两个语句,则第二个连接中的select查询可以执行 而update必须等待第一个事务释放共享锁转为排它锁后才能执行即要等待30秒 3)死锁 增设table2(D,E) D E d1 e1 d2 e2 在第一个连接中执行以下语句 begin tran update table1 set A='aa' where B='b2' waitfor delay '00:00:30' update table2 set D='d5' where E='e1' commit tran 在第二个连接中执行以下语句 begin tran update table2 set D='d5' where E='e1'

MySQL个常用面习题需要找工作的一定要看

1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 1.主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2.从:io线程——在使用startslave之后,负责从master上拉取binlog内容,放进自己的relaylog中; 3.从:sql执行线程——执行relaylog中的语句; 2、MySQL中myisam与innodb的区别,至少5点 (1)、问5点不同; 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>.InnoDB支持MVCC,而MyISAM不支持 4>.InnoDB支持外键,而MyISAM不支持 5>.InnoDB不支持全文索引,而MyISAM支持。 (2)、innodb引擎的4大特性 插入缓冲(insertbuffer),二次写(doublewrite),自适应哈希索引(ahi),预读(readahead) (3)、2者selectcount(*)哪个更快,为什么 myisam更快,因为myisam内部维护了一个计数器,可以直接调取。 3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1)、varchar与char的区别 char是一种固定长度的类型,varchar则是一种可变长度的类型

(2)、varchar(50)中50的涵义 最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为orderbycol采用fixed_length计算col长度(memory引擎也一样) (3)、int(20)中20的涵义 是指显示字符的长度 但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0 20表示最大显示宽度为20,但仍占4字节存储,存储范围不变; (4)、mysql为什么这么设计 对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样; 4、问了innodb的事务与日志的实现方式 (1)、有多少种日志; 错误日志:记录出错信息,也记录一些警告信息或者正确的信息。 查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。 二进制日志:记录对数据库执行更改的所有操作。 中继日志: 事务日志:

数据库解除死锁方法

先查看哪些表被锁住了: 杀进程中的会话: 如果有ora-00031错误,则在后面加immediate;alter system kill session '29,5497' immediate; 如何杀死oracle死锁进程

1.查哪个过程被锁: 查V$DB_OBJECT_CACHE视图: SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='0'; 2. 查是哪一个SID,通过SID可知道是哪个SESSION: 查V$ACCESS视图: SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名'; 3. 查出SID和SERIAL#: 查V$SESSION视图: SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'; 查V$PROCESS视图: SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR'; 4. 杀进程: (1)先杀ORACLE进程: ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#'; (2)再杀操作系统进程: KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID。 Oracle的死锁 查询数据库死锁:

查询出来的结果就是有死锁的session了,下面就是杀掉,拿到上面查询出来的SID和SERIAL#,填入到下面的语句中: alter system kill session 'sid,serial#'; 一般情况可以解决数据库存在的死锁了,或通过session id 查到对应的操作系统进程,在Unix中杀掉操作系统的进程。 然后采用kill (unix)或orakill(windows )。 在Unix中: 经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。 1)查找死锁的进程: 2)kill掉这个死锁的进程: alter system kill session ‘sid,serial#’; (其中sid=l.session_id) 3)如果还不能解决:

数据库原理及应用习题集参考答案

《数据库原理及应用》习题集参考答案 一、简答题 1、什么是数据库管理系统? 一种负责数据库的建立、操作、管理和维护的软件系统。 2、数据库系统有哪几种模式?分别用来描述什么? (1)外模式 是用户的数据视图,用来描述数据的局部逻辑结构,是模式的子集。(2)模式 是所有用户的公共数据视图,用来描述数据库中全体数据的全局逻辑结构和特征。 (3)内模式 又称存储模式,描述数据的物理结构及存储方式 3、什么是事务?事务有哪些特征? 答:所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。 事务的特征:原子性、一致性、隔离性、持续性。 4、POWER BUILDER中事务对象有何作用? 答:PowerBuider的事务对象是应用程序与数据库之间进行通信的桥梁,在应用程序初启时,系统自动创一个为SQLCA(SQL Communication Area, SQL通讯区)的全局事务对象,该对象在应用程序的任何地方都可以访问 应用程序与数据库的所有通信都需要通过事务对象来完成,除了直接使用系统的缺省事务对SQLCA外,开发人员也可以创建自己的事务对象。 5、SQL SERVER中INSERTED表和DELETED表有何用? 答:触发器中用到两种特殊的表:删除表和插入表触发器中使用名为“deleted"和“inserted"来参照这些表;删除表存储受DELTE和UPDATE语句影响的行的副本当执行DELETE或UPDATE语句时,行从触发器表中删除并传递到删除表中。删除表和触发器表通常没有共有的行。 插入表存储受INSERT和UPDA TE语句影响的行的副本当执行一NSERT 或UPDA T语句时,新行同时增加到插入表和触发器表中。插入表中的行是触发器表中新行的副本可使用删除表和插入表中的行来参照相关表中的行,或测试被删除或插入行中的值。

数据库死锁定位及解决方案描述

问题描述: 系统业务繁忙时(特别是周一或周五),Oracle数据库出现死锁现象,造成数 据库挂起,业务中断。 问题定位 首先分析数据库后台日志alert_raca1.log,alert_raca2.log,发现数据库死 锁信息: Global Enqueue Services Deadlock detected. More info in file /oracle/admin/raca/bdump/raca1_lmd0_807258.trc. Fri Mar 12 14:55:15 2010 Global Enqueue Services Deadlock detected. More info in file /oracle/admin/raca/bdump/raca1_lmd0_807258.trc … 找到相应的trace文件中的信息进行分析: user session for deadlock lock 70000020a0d60a0 pid=138 serial=70 audsid=14754928 user: 49/GFCOB O/S info: user: , term: , ospid: 1234, machine: GF14 program: Current SQL Statement: update WF_TASKINFO set processInfoId=:1, taskInstanceId=:2, nodeId=:3, taskName=:4, taskDescription=:5, status=:6, startDate=:7, handleGroup=:8, handleBy=:9, createdDate=:10, endedGroup=:11, endedBy=:12, endedDate=:13, expectedEndDate=:14, ownerType=:15, lockedBy=:16, lockedDate=:17, priority=:18, nodeType=:19, isBacked=:20, isCopied=:21, isSuspended=:22, tokenId=:23, extendField=:24, lastTaskInfoId=:25 where taskInfoId=:26 user session for deadlock lock 70000020a0d5f50 pid=246 serial=77 audsid=14754935 user: 49/GFCOB O/S info: user: , term: , ospid: 1234, machine: GF14 program: Current SQL Statement: update HIS_GDB_B_BUSINESSISSUE set operateId=:1, taskInfoId=:2, handleGroup=:3, handleBy=:4, createdDate=:5, endedDate=:6, endedType=:7, reply=:8, remark=:9 where orderHandleHistoryId=:10 找到造成死锁的sql语句后和业务开发人员进行分析,排除了队列死锁和位图索引死锁;

mysql锁表和解锁语句

mysql锁表和解锁语句 对于MySQL来说,有三种锁的级别:页级、表级、行级 页级的典型代表引擎为BDB。 表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。 行级的典型代表引擎为INNODB。 -我们实际应用中用的最多的就是行锁。 行级锁的优点如下: 1)、当很多连接分别进行不同的查询时减小LOCK状态。 2)、如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。行级锁的缺点如下: 1)、比页级锁和表级锁要占用更多的内存。 2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。 3)、容易出现死锁。 对于写锁定如下: 1)、如果表没有加锁,那么对其加写锁定。 2)、否则,那么把请求放入写锁队列中。 对于读锁定如下: 1)、如果表没有加写锁,那么加一个读锁。

2)、否则,那么把请求放到读锁队列中。 当然我们可以分别用low_priority 以及high_priority在写和读操作上来改变这些行为。 如果想要在一个表上做大量的INSERT 和SELECT 操作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里。可以用以下命令实现: mysql> LOCK TABLES real_table WRITE, insert_table WRITE; mysql> INSERT INTO real_table SELECT * FROM insert_table; mysql> TRUNCATE TABLE insert_table; mysql> UNLOCK TABLES; InnoDB 使用行级锁,BDB 使用页级锁。对于InnoDB 和BDB 存储引擎来说,是可能产生死锁的。这是因为InnoDB 会自动捕获行锁,BDB 会在执行SQL 语句时捕获页锁的,而不是在事务的开始就这么做。 行级锁的优点有: 在很多线程请求不同记录时减少冲突锁。 事务回滚时减少改变数据。 使长时间对单独的一行记录加锁成为可能。 行级锁的缺点有:

MySQL练习题及答案

答案见参考下列黄色标记 一、下面所有题目中包括单选或多选 1.若MySQL Server运行在Linux系统上,那访问MySQL服务器的客 户端程序也必须运行在Linux系统吗? A.是 B. 否 2.MySQL与其他关系型数据库(SQL Server/Oracle)架构上最大的区别 是? A.连接层 B. SQL层 C.存储引擎层 3.MySQL使用磁盘空间来存储下面哪些信息? A.server和client程序、其他lib库文件 B.日志文件和状态文件 C.数据库 D.表格式(.frm)文件、数据文件、索引文件 E.当内部临时表超过控制设置时,由内存表形式转化为磁盘形式存储 F.上面所有 4.下面哪四种是mysql客户端程序的功能? A.创建、删除数据库 B.创建、删除、修改表和索引

C.使用shutdown命令关闭服务器 D.创建、管理用户 E.显示replication状态信息 F.使用start backup命令来进行数据库二进制备份 5.在MySQL内部有4种常见日志,哪种日志是不能直接cat或more 文本查阅日志内容? A.错误日志(error-log) B.二进制日志(bin-log) C.查询日志(query-log) D.慢查询日志(slow-log) 6.下面哪三种方式可以查看Country表的存储引擎? A.SHOW CREATE TABLE Country; B.SHOW ENGINE Country STATUS;; C.SHOW TABLE STATUS LIKE ‘Country’; D.SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=’Country’; E.SELECT ENGINE FROM INFORMATION_SCHEMA.ENGINES WHERE TABLE_NAME =’County’; 7.在高并发、事务等场景下,MySQL5.6数据库默认使用哪种存储引

MySQL 数据库锁定机制

MySQL 数据库锁定机制 MySQL 数据库锁定机制简介 ●行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。 虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。 ●表级锁定(table-level) 和行级锁定相反,表级别的锁定是MySQL 各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。当然,锁定颗粒度大所带来最大的负面影响就是出现

锁定资源争用的概率也会最高,致使并大度大打折扣。 ●页级锁定(page-level) 页级锁定是MySQL 中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。 在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。 在MySQL 数据库中,使用表级锁定的主要是MyISAM,Memory,CSV 等一些非事务性存储引擎,而使用行级锁定的主要是Innodb 存储引擎和NDB Cluster 存储引擎,页级锁定主要是BerkeleyDB 存储引擎的锁定方式。MySQL 的如此的锁定机制主要是由于其最初的历史所决定的。在最初,MySQL 希望设计一种完全独立于各种存储引擎的锁定机制,而且在早期的MySQL 数

mysql中myisam锁

mysql中myisam锁问题: 1.myisam表锁状态参数 mysql> show status like "table%"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Table_locks_immediate | 249 | | Table_locks_waited | 0 | +-----------------------+-------+ 2 rows in set (0.01 sec) #如果table_locks_waited的值比较高,则说明存在着较为严重的表级锁争用情况. 2.mysql锁分为两种模式: 1)table read lock 表共享读锁 2)table write lock 表独占写锁 可见,对myisam表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同表的写请求,对myisam表的写操作,则会阻塞其他用户对同一表的读和写操作;myisam表的读操作和写操作之间,以及写操作之间是串行的 3.表锁测试 首先测试读锁: 1) mysql> show create table t2; +-------+--------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------+ | t2 | CREATE TABLE `t2` ( `id` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 | +-------+--------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 2) mysql> lock table t2 read; Query OK, 0 rows affected (0.00 sec) 3) mysql> select * from t2; +------+ | id | +------+ | 1 | | 2 | | 3 | | 5 |

数据库中的锁

数据库锁的基本概念 为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。 排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T 释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。 2 Oracle 多粒度封锁机制介绍 根据保护对象的不同,Oracle数据库锁可以分为以下几大类: (1) DML lock(data locks,数据锁):用于保护数据的完整性; (2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义); (3) internal locks 和l a t c h es(内部锁与闩):保护内部数据库结构; (4) distributed locks(分布式锁):用于OPS(并行服务器)中; (5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。 本文主要讨论DML(也可称为data locks,数据锁)锁。从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。 2.1 Oracle的TX锁(行级锁、事务锁) 许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行。 在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。Oracle不象其它一些DBMS(数据库管理系统)那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了其它数据库系统使用行级封锁时经常发生的锁数量不够的情况。数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。 2.2 TM锁(表级锁) 2.2.1 意向锁的引出 表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。 2.2.2 意向锁的类型 由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁: 意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;

mysql锁解决并发问题

mysql锁解决并发问题 文章分为以下几个要点 1.问题描述以及解决过程 2.MySQL锁机制 3.数据库加锁分析 下面讨论的都是基于MySQL的InnoDB。 0. 问题描述以及解决过程 因为涉及到公司利益问题,所以下面很多代码和数据库信息,进行了缩减和修改,望见谅。 业务场景是优惠券系统规则规定了一个优惠券活动最多可发行多少张优惠券和每个用户最多可领取优惠券数量。下面列出两张表的结构。 活动表 CREATE TABLE`coupon_detail`( `coup_id`int(11) NOT NULL AUTO_INCREMENT, `act_code`char(6) NOT NULL DEFAULT''COMMENT '活动编号', `coup_code`char(6) NOT NULL DEFAULT''COMMENT '优惠券编码', `coup_user_id`int(11) NOT NULL DEFAULT'0'COMMENT '领取券用户id', PRIMARY KEY(`coup_id`), UNIQUE KEY`coup_code_idx`(`coup_code`) USING BTREE COMMENT '优惠券编码唯一索引', KEY`coup_user_idx`(`coup_user_id`) USING BTREE COMMENT '用户id普通索引', KEY`act_code_idx`(`act_code`) USING BTREE COMMENT '活动编码普通索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='优惠券明细表'; 假设一个优惠券活动设置的最大发行量为1000张优惠券,单个用户最多可领取1张优惠券。如下 insert into coupon_activity values(1,'000000',1000,1,0);

数据库常用表

用友数据库常用表 数据库中重要表的讲解 1、.ufysftem库此库是系统参数数据库 其中主要存放各个帐套的共用信息 意义很大 日常应用的也很多。 A ua_account 是帐套信息表 其中系统帐套存放路径、帐套启用年度、帐套启用月份、企业类型、行业性质等字段特别重要。 B ua_account_sub 帐套各模块启用月度及最大结帐月表 其中子系统id 字段、最大结帐月字段、子系统启用日期字段十分重要。 C ua_period 帐套会计日期划分表。 D ua_task 异常任务记录表01(在所有模块退出后 此表应为空) E ua_tasklog 异常任务记录表02 同上 F ua_log 上机日志表 G ua_tonextyear 建立下年年度帐时要建立的表 此表也特别重要 在建立年度帐失败时 一般可从此表记录的内容进行排查 以发现上年度是哪张表有问题 . H、ua_holdauth 记录每个操作员在每个帐套每个年度的分配权限。 2、ufdata_00n_200x库此数据库叫应用数据库 命名规则是ufdata_帐套编号_年度 四位计数 其中主要存放每个年度的帐务数据 包括各个模块的数据。在数据表中 命名方法是模块代码_表名。其中 ap代表应付 ar代表应收;gl代表总帐;wa代表工资 fa代表固定资产;pu代表采购 sa代表销售 st代表库存;ia代表存货 fd代表资金管理;ca代表成本等。 A accinformation 帐套参数表 包括财务和购销存模块设置选项中定义的所有参数 如启用时间、系统年度等等。 B ap_closebill 收付款结算表 主要记录收款单、付款单的内容 C ap_detail 应收应付明细表 主要记录已结算的采购发票和已审核的销售发票所形成的应收应付记录。 D ap_vouch/s 应付/收单主子表 记录销售已审核的代垫费用单 应收、应付单等的表头和表体记录。 E ap_vouchtype 单据类型表 主要记录应收应付系统所使用的各种单据的类型和代码。 F currentstock 现存量表 写入存货的不同自由项、所在仓库到目前为止的结存数量和结存件数。 G customer 客户档案表 写入客户的记录。 H dispatchlist/s 发货单、委托代销结算单主子表 主表写入表头内容 子表写入表体内容。 I Dsign 凭证类别表 定义凭证类别的记录。 J endispatch/s 委托代销发货单主子表。 K gl_accass 辅助总帐表 写入带有辅助核算科目的期初余额以及凭证记帐之后带有辅助核算科目的记录。 L gl_accsum 科目总帐表 写入科目的期初余额和凭证记帐之后科目的增加变化记录。 M gl_accvouch 凭证及明细帐表 写入带有个人往来、供应商往来、客户往来的科目的期初余额及所有模块填制的凭证的明细记录。

数据库账号被锁定解决

在Oracle数据库操纵中,登录Oracle账号时提示失败,并且Oracle账号频繁被锁定。造成此故障的原因是什么呢?北京海淀甲骨文学习中心就介绍了这一过程,经由过程慢慢排查我们就能找到该故障的原因了。 下面记录下查找这个题目的步调。 1. 找到账号被锁按时候 哄骗sqlplus或者sqldeveloper,查询账号被锁定的时候,相干语句如下: --批改当前会话的日期显示格局 alter session set nls_date_format = ""yyyy-MM-dd hh24:mi:ss""; --查询被锁定账号的锁按时候 username,lock_date dba_users where username like ""TRSEKPV65_DEMO""; 比如这里的查询到的锁按时候为:20:03:03 2. 找到oracle的安装目次 项目组常识库的oracle安装路径为:C:\devsoftware\oracle11g 3. 找到监听日记 找到 C:\devsoftware\oracle11g\diag\tnslsnr\DEV2-216\listener\trace\listener.log文件,该文件会记录oracle的一些跟踪信息 4. 查看监听日记 找到该文件后,发明很大,无法用editplus打开。把该文件上传到linux机械或者在windows机械高低载一个tail.exe法度,履行tail -20 listener.log号令,查看该文件的最后20行内容。 5. 定位题目 按照上方查询到的时候,在日记中找到对应的时候地位,可以定位到当前时候Oracle所履行的操纵。 01-8月 -2011 20:03:35 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=portalteam)(CID=(PROGRAM=D:\TRS\TRSGateway4.6\gwserver_x64\TrsAgent.exe)(HOST=DEV2-216)(USER=Administrator))) * (ADDRESS=(PROTOCOL=tcp)(HOST=fe80::e816:9e03:60ac:fdaa%11)(PORT=13678)) * establish * portalteam * 0 6. 总结 从上边可以看到,造成Oracle的账号被锁定的原因是由” TrsAgent.exe”过程造成的。细心一想,本来批改了暗码,没有批改GateWay的登录信息,所以造成了该账号登录Oracle经常失败,因为我们设备了Oracle的最大容许登录错误次数为10,所以跨越10次错误后账号将被锁定。

相关文档
最新文档