数据库学习8-锁

锁和表分区 *重点:1行级锁在什么情况下触发(insert,update,delete,select...for update);2怎么释放行级锁(commit;rollback);


锁:自动保护数据的机制;




表级锁:
lock table 表名 in 锁定模式 mode [nowait];
行共享(row share, rs):允许其他用户访问和锁定表,禁止排他锁定整个表 
行排他(row exclusive, rx):在行共享模式基础上,禁止其他用户在表上使用共享锁 
共享(share, s):共享锁将锁定表,只允许其他用户查询表中的行,不允许添加、更新或删除行,多个用户可同时在同一表中设置共享锁(允许资源共享) 例如,每天的结帐操作时需更新日销售额表,可在更新该表示设置共享锁以确保数据一致性 
共享行排他(share row exclusive, srx):比共享锁更多的限制,防止其他事务在表上使用共享锁、共享行排他锁以及排他锁 
排他(exclusive, x):对表执行的最大限制,其他用户只能查询该表的记录,该锁防止其他事务对表做任何更新或在表上设置任何类型的锁 




悲观锁:假设并发操作会出现歧义;
乐观锁:假设并发操作不会出现歧义;
        1.update操作时,会拿操作之前和操作之后的          数据进行对比;
        2.进行数据操作时,操作之前和操作之后会有        一个列作为版本号,并对版本号进行比对;
        3.进行数据操作时,操作之前和操作之后会有           一个列作为时间戳,并对时间戳进行比对;


表分区



--创建表空间
CREATE TABLESPACE zj_space
     DATAFILE 'D:\zj_space.dbf'
     SIZE 40m;

--创建用户
CREATE USER zj
    IDENTIFIED BY zj
    DEFAULT TABLESPACE zj_space  
    TEMPORARY TABLESPACE temp;   

--赋权限给用户
GRANT SELECT ON emp TO zj;
GRANT CREATE SESSION TO zj;
GRANT CREATE TABLE TO zj;

--赋角色给用户
--通常的操作赋以下两个角色
GRANT CONNECT TO zj;
GRANT RESOURCE TO zj;

REVOKE DBA FROM scott;

GRANT INSERT ON emp TO zj;

SELECT * FROM all_users;

--查看 dba 的所有权限视图
SELECT * FROM dba_sys_privs;
--查看当前所有的权限视图
SELECT * FROM session_privs;
--查看当前用户所有权限视图
SELECT * FROM user_sys_privs;
--查看当前用户所有的角色
SELECT * FROM user_role_privs;
--修改用户密码(必须是管理员)
ALTER USER SYSTEM IDENTIFIED BY SYSTEM;
--解锁用户
ALTER USER scott ACCOUNT UNLOCK;

-- 锁
--行级锁 排它锁
--进行数据操作 insert,update,delete
UPDATE emp SET ename='WEI01' WHERE empno=8001;

SELECT * FROM emp FOR UPDATE;

SELECT * FROM emp FOR UPDATE WAIT 3;
SELECT * FROM emp FOR UPDATE NOWAIT;

SELECT * FROM emp FOR UPDATE OF ename,sal;

COMMIT;
ROLLBACK;

SELECT * FROM emp

--表级锁 
LOCK TABLE emp exclusive MODE;

--表分区
--范围分区
CREATE TABLE bfq
(
  b_id NUMBER,
  b_sal NUMBER
)
PARTITION BY RANGE(b_sal)
(
   PARTITION p1 VALUES LESS THAN(1000),
   PARTITION p2 VALUES LESS THAN(2000),
   PARTITION p3 VALUES LESS THAN(MAXVALUE)
)
ALTER TABLE bfq SPLIT PARTITION p2 AT(1500) INTO(PARTITION p21,PARTITION p22);
ALTER TABLE bfq MERGE PARTITIONS p21,p22 INTO PARTITION p2;
SELECT * FROM bfq PARTITION(p2);

INSERT INTO bfq VALUES(1,900);
INSERT INTO bfq VALUES(2,1900);
INSERT INTO bfq VALUES(3,3900);
INSERT INTO bfq VALUES(4,4900);
INSERT INTO bfq VALUES(5,999);
INSERT INTO bfq VALUES(6,2000);
INSERT INTO bfq VALUES(7,1000);
COMMIT;
--散列分区
CREATE TABLE bfq1
(
  b_id NUMBER,
  b_name NUMBER
)
PARTITION BY HASH(b_id)
(
  PARTITION d1,
  PARTITION d2,
  PARTITION d3
)
--列表分区
CREATE TABLE bfq2
(
  b_id NUMBER,
  b_address VARCHAR2(20)
)
PARTITION BY LIST(b_address)
(
  PARTITION d1 VALUES('长沙','株洲','湘潭'),
  PARTITION d2 VALUES('岳阳','益阳','郴州'),
  PARTITION d3 VALUES('常德','衡阳','邵阳'),
  PARTITION d4 VALUES('张家界','娄底','吉首')
)

INSERT INTO bfq2 VALUES(1,'长沙');
INSERT INTO bfq2 VALUES(1,'株洲');
INSERT INTO bfq2 VALUES(1,'岳阳');
INSERT INTO bfq2 VALUES(1,'衡阳');
INSERT INTO bfq2 VALUES(1,'邵阳');
INSERT INTO bfq2 VALUES(1,'常德');
INSERT INTO bfq2 VALUES(1,'娄底');
INSERT INTO bfq2 VALUES(1,'常德');
INSERT INTO bfq2 VALUES(1,'吉首');
INSERT INTO bfq2 VALUES(1,'张家界');
INSERT INTO bfq2 VALUES(1,'益阳');
INSERT INTO bfq2 VALUES(1,'郴州');COMMIT;

SELECT * FROM bfq2 PARTITION(d3);

--复合分区

CREATE TABLE bfq3
(
  b_id NUMBER,
  b_sal NUMBER
)
PARTITION BY RANGE(b_sal)
SUBPARTITION BY HASH(b_id)
SUBPARTITIONS 2
(
   PARTITION p1 VALUES LESS THAN(1000),
   PARTITION p2 VALUES LESS THAN(2000),
   PARTITION p3 VALUES LESS THAN(MAXVALUE)
)

DELETE FROM sales PARTITION(d1)

--添加分区
ALTER TABLE sales ADD PARTITION d4 VALUES LESS THAN(4000);
--删掉分区
ALTER TABLE sales DROP PARTITION d4;
--清除或截断分区数据
ALTER TABLE sales TRUNCATE PARTITION d3;

--合并表分区
ALTER TABLE sales MERGE PARTITIONS d1,d2 INTO PARTITION d2;
--拆分表分区 d2的范围从1500的位置拆分
ALTER TABLE sales SPLIT PARTITION d2 AT(1500) INTO(PARTITION d21,PARTITION d22);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值