Oracle Class3. 锁和表分区
------------------------2013-5-8------------------------
DML锁可以分为,行锁,表级锁,死锁。
DDL锁可以分为,排他DDL锁,共享DDL锁,分析锁。
--查看当前数据库里锁的情况。
select object_id,session_id,locked_mode from v$locked_object;
如果出现了锁的问题,某个DML操作可能等待很久没有反应。
grant select on emp to newlifeyhj;
Grant delete on emp to newlifeyhj;
Grant all on emp to newlifeyhj;
-- 访问权限精细到列。 报错 ORA-00905: 缺少关键字
Grant update on emp(sal) to newlifeyhj;
Grant select on emp(ename,sal) to newlifeyhj;
--修改,锁定资源。只到提交了才会执行。
update scott.emp set sal = sal +100 where empno = '7369';
将scott.emp表的查询,修改权限给newlifeyhj来测试。
--表拥有者执行加锁查询
--select * from emp where empno = '7369' for update wait 5;
--select * from emp where empno = '7369' for update nowait;
commit;
--for update of 专用于连接查询中锁定某一个或是某几个表。
--表拥有者对表进行共享锁定
--lock table emp in share mode;
select * from emp where empno='7369'
--rollback;
--共享更新
--lock table emp in share update mode;
select * from scott.emp where empno = '7369';
--排他锁
--lock table emp in exclusive mode;
--rollback;
--同义词,类似表的别名。
--create synonym o_emp for emp;
select * from o_emp where empno = '7369';
##表分区##
#范围分区#
create table student(
stu_name varchar2(8),
stu_age number(2)
)
partition by range(stu_age)
(
partition p1 values less than(12),
partition p2 values less than(16),
partition p3 values less than(20),
partition p4 values less than(maxvalue)
);
desc user_tab_partitions
select table_name,partition_name from user_tab_partitions where table_name = 'STUDENT'; //表名区分大小写。
select table_name,partition_name,high_value,tablespace_name from user_tab_partitions where table_name = 'STUDENT';
--分区查询--
select * from student partition(p1);
select * from student partition(p2);
select * from student partition(p3);
select * from student partition(p4);
#列表分区#
create table student2(
stu_name varchar2(8),
stu_age number(2),
stu_address varchar2(12)
)
partition by list(stu_address)(
partition east values('向阳村','红旗广场'),
partition south values('南大门','摩托车大市场'),
partition west values('马家河','炎帝广场'),
partition north values('响石广场','清石广场')
);
insert into student2 values ('ANiu',12, '向阳村');
insert into student2 values ('ANiu',15, '南大门');
insert into student2 values ('ANiu',17, '清石广场');
insert into student2 values ('ANiu',19, '炎帝广场');
select * from student2;
select * from student2 partition(east);
select * from student2 partition(west);
按分区删除数据。
delete from student2 partition(east);
select table_name, partition_name, high_value, tablespace_name from user_tab_partitions where table_name = 'STUDENT2';
#散列分区#
create table employee(
employee_id varchar2(5),
employee_name varchar2(20),
department varchar2(10)
)
partition by hash(department)(
partition D1,
partition D2,
partition D3
);
#复合分区#
范围分区与散列分区或列表分区的组合。
CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2 (5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER (10)
)
PARTITION BY RANGE (SALES_DATE)
SUBPARTITION BY HASH (PRODUCT_ID)
SUBPARTITIONS 5
(
PARTITION S1 VALUES LESS THAN (TO_DATE(‘01/4月/2001',
'DD/MON/YYYY')),
PARTITION S2 VALUES LESS THAN (TO_DATE(‘01/7月/2001',
'DD/MON/YYYY')),
PARTITION S3 VALUES LESS THAN (TO_DATE(‘01/9月/2001',
'DD/MON/YYYY')),
PARTITION S4 VALUES LESS THAN (MAXVALUE)
);
##表分区维护##
--删除分区-- 删除一个指定的分区,分区的数据也随之删除。
--alter table student drop partition p4;
--增加分区--
--alter table student add partition p5 values less than(90);
--截断分区-- 删除指定分区中的所有记录
--alter table student truncate partition p3;
--合并分区-- ORA-14012: 结果分区名与现有分区名发生冲突, p6新的分区名。
alter table student merge partitions p1,p2 into partition p6;
--拆分分区--
alter table sales split partition p2 at(1500) into (partition p21,partition p22)
select table_name, partition_name from user_tab_partitions where table_name = 'STUDENT';
##序列##
#创建序列#
create sequence seqTest start with 1 increment by 1 maxvalue 9;
select seqTest.nextval from dual; //下一个值 注意:不是value是val
select seqTest.currval from dual; //查询当前值 注意:不是value是val
查看数据字典的结构
desc user_sequences;
删除序列
drop sequence seqTest;
锁是数据库用来控制共享资源并发访问的机制。
锁用于保护正在被修改的数据。
直到提交或回滚了事务之后,其他用户才可以更新数据。
锁定的优点:一致性和完整性。并行性
行级锁和表级锁。
使用commit或rollback语句释放锁。
表级锁类型
行共享 行排他 共享 共享行排他 排他
将一个表分成多个分区,只访问表中的特定分区。
将不同的分区存储在不同的磁盘,提高访问性能和安全性。
独立地备份和恢复每个分区。