㈠ mysql 表加读锁别的sql还能在操作该表吗
不能操作了, innodb四种级别的锁, 未提交读, 已提交读, 可重复读 和 可序列化, 不知道你说的是哪个
如果是限制读, 那就是是最高级别了, 其他操作都不行了.
㈡ 当另外一个进程已经为状态数据库加锁了怎么解决
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:
DML锁(data locks,数据锁),用于保护数据的完整性;
DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;
内部锁和闩(internal locks and latches),保护数据库的内部结构,应用于SGA;
在我们实际应用开发中涉及较多的是DML锁,其他两种的话DBA会更加关心点;
DML锁的目的在于保证并发情况下的数据完整性,主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如下图所示:
值 锁模式 锁描述 SQL
0 NONE
1 NULL 空 SELECT
2 SS(ROW-S) 行级共享锁
其他对象只能查询这些数据行 SELECT FOR UPDATE、LOCK FOR UPDATE、
LOCK ROW SHARE
3 SX(ROW-X) 行级排它锁
在提交前不允许做DML操作 INSERT、UPDATE、DELETE、
LOCK ROW SHARE
4 S(SHARE) 共享锁 CREATE INDEX、LOCK SHARE
5 SSX(S/ROW-X) 共享行级排它锁 LOCK SHARE ROW EXCLUSIVE
6 X(eXclusive) 排它锁 ALTER TABLE、DROP TABLE、DROP INDEX、
TRUNCATE TABLE、LOCK EXCLUSIVE
在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
在大概了解oracle的锁机制之后,我们来解决几个基本的问题:
1.UPDATE/DELETE操作会将RS锁定,直至操作被COMMIT或者ROLLBACK;
若操作未COMMIT之前其他session对同样的RS做变更操作,则操作会被hold,直至前session的UPDATE/DELETE操作被COMMIT;
2.session内外SELECT的RS范围
前提:INSERT、UPDATE操作未COMMIT之前进行SELECT;
若在同一session内,SELECT出来的RS会包括之前INSERT、UPDATE影响的记录;
若不在同一session内,SELECT出来的RS不会包括未被COMMIT的记录;
3.SELECT.... FOR UPDATE [OF cols] [NOWAIT/WAIT] [SKIP LOCKED]
OF cols:只锁定指定字段所在表的RS,而没有指定的表则不会锁定,只会在多表联合查询时出现;
NOWAIT:语句不会hold,而是直接返回错误ORA-00054: resource busy and acquire with NOWAIT specified;
WAIT N:语句被hold N秒,之后返回错误ORA-30006: resource busy; acquire with WAIT timeout expired;
SKIP LOCKED:不提示错误,而是直接返回no rows selected;
以上几个选项可以联合使用的,比较推荐的有:
SELECT.... FOR UPDATE NOWAIT:对同一RS执行该SQL时,直接返回错误;
SELECT.... FOR UPDATE NOWAIT SKIP LOCKED:对同一RS执行该SQL时,直接返回空行;
PS:当RS被LOCK住之后,只对同样请求LOCK的语句有效,对无需LOCK的SELECT语句并没有任何影响;
㈢ “sql”加锁机制是什么
您好!锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。
我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象。即如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。这些问题包括:丢失更新、脏读、不可重复读和幻觉读。数据库加锁就是为了解决以上的问题。
当然,加锁固然好,但是一定要避免死锁的出现。
在数据库系统中,死锁是指多个用户(进程)分别锁定了一个资源,并又试图请求锁定对方已经锁定的资源,这就产生了一个锁定请求环,导致多个用户(进程)都处于等待对方释放所锁定资源的状态。这种死锁是最典型的死锁形式, 例如在同一时间内有两个事务A和B,事务A有两个操作:锁定表part和请求访问表supplier;事务B也有两个操作:锁定表supplier和请求访问表part。结果,事务A和事务B之间发生了死锁。死锁的第二种情况是,当在一个数据库中时,有若干个长时间运行的事务执行并行的操作,当查询分析器处理一种非常复杂的查询例如连接查询时,那么由于不能控制处理的顺序,有可能发生死锁现象。
在应用程序中就可以采用下面的一些方法来尽量避免死锁了: (1)合理安排表访问顺序。 (2)在事务中尽量避免用户干预,尽量使一个事务处理的任务少些, 保持事务简短并在一个批处理中。 (3)数据访问时域离散法, 数据访问时域离散法是指在客户机/服务器结构中,采取各种控制手段控制对数据库或数据库中的对象访问时间段。主要通过以下方式实现: 合理安排后台事务的执行时间,采用工作流对后台事务进行统一管理。工作流在管理任务时,一方面限制同一类任务的线程数(往往限制为1个),防止资源过多占用; 另一方面合理安排不同任务执行时序、时间,尽量避免多个后台任务同时执行,另外, 避免在前台交易高峰时间运行后台任务。 (4)数据存储空间离散法。数据存储空间离散法是指采取各种手段,将逻辑上在一个表中的数据分散到若干离散的空间上去,以便改善对表的访问性能。主要通过以下方法实现: 第一,将大表按行或列分解为若干小表; 第二,按不同的用户群分解。 (5)使用尽可能低的隔离性级别。隔离性级别是指为保证数据库数据的完整性和一致性而使多用户事务隔离的程度,SQL92定义了4种隔离性级别:未提交读、提交读、可重复读和可串行。如果选择过高的隔离性级别,如可串行,虽然系统可以因实现更好隔离性而更大程度上保证数据的完整性和一致性,但各事务间冲突而死锁的机会大大增加,大大影响了系统性能。 (6)使用绑定连接, 绑定连接允许两个或多个事务连接共享事务和锁,而且任何一个事务连接要申请锁如同另外一个事务要申请锁一样,因此可以允许这些事务共享数据而不会有加锁的冲突。
总之,了解SQL Server的锁机制,掌握数据库锁定方法, 对一个合格的DBA来说是很重要的。
㈣ SQL insert为什么加锁
保证数据一致性,否则2个人一起插一样的数据,但是这个又不允许数据重复,数据库就不会处理了
㈤ 两个SQL的锁表问题
不是很明白的你的意思,查看是否锁表的sql:
select s.SID,s.SERIAL#,s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,s.terminal,s.machine,s.program,s.osuser
from v$session s,v$lock l,dba_objects o
where s.sid=l.sid
and o.object_id=l.id1
and s.username is not null ;
如果1 .2是同时操作一张表,最好是执行完一条sql先commit一下在执行第二条这样肯定不会锁表,我不知道我理解对了没有?
ps:不能,数据库的事务机制不允许同一时刻同一记录update 如果先update操作会先lock table等执行完释放资源才有其他的操作。
以下是我做过的测试:
eg:select * from table for update;
1.不允许做for update查询。
2.允许普通search查询。
3.不允许对表中任何记录做update操作;
4.允许insert操作;
5.不允许delete操作。
另:一楼说的是对的。
㈥ sql里的事务语句 默认都有加数据锁的么
就sqlserver数据库而言,每一条语句在默认事务级别下(可提交读级别)都是加锁的
如一条普通的查询,要加S锁(共享),一个更新要加U锁(更新)等等
你说的表锁、行锁只是锁的粗粒程度,如字面意思,行锁是锁住几行,表锁就是锁住整个表所在的全部数据页
㈦ SQL 存储过程如何加锁
create or replace procere testp is
LN number;
jcr_lockhandle varchar2(128);
begin
DBMS_LOCK.allocate_unique('Lock', jcr_lockhandle);--针对当前session加锁
LOOP
LN := DBMS_LOCK.request ( jcr_lockhandle, TIMEOUT => 0);
IF LN NOT IN (0, 4)--判断是否被别session锁住
THEN
DBMS_OUTPUT.put_line ('Already run...');
DBMS_LOCK.sleep (2);--已经被人锁住,休眠2秒
ELSE
EXIT;--没有锁,退出轮询
END IF;
END LOOP;
dbms_output.put_line('1'); ----你要加锁的业务逻辑哦
LN := DBMS_LOCK.release ( jcr_lockhandle);--释放资源
end ;
㈧ sql 怎样加行锁
updatetable_namewith(rowlock)setcolumn_name=new_valuewhereyour_condition
㈨ SQL语言中嵌套式是什么加锁模式
摘要 如果只是单个的条件的时候,即只有一个连接条件的时候,使用两种方式都是一样的,但是,如果是多个条件的话,就要考虑一下效率了,一般这种情况下需要嵌套查询更能提高效率,因为连接查询是先要做笛卡尔积之后之后再筛选,而嵌套查询的话可以先筛选。嵌套查询也可以理解为子查询,通常把一个sql的结果集用作另一个sql的一部份都称为嵌套或者称这个sql包含有子查询。
㈩ sql server 加锁问题
什么怎么写?你这2个事务肯定会死锁啊,
如果想避免死锁,就要按顺序读取表,
比如2个事务都先读取test1,再读取test2,就可以避免死锁了
事务2进行如下操作:
begin tran tran2
select * from test1 with(xlock)
waitfor delay '00:00:10'
select * from test2 with(xlock)
commit transaction