/

    锁:数据库控制共享资源并发访问的机制,用于保护正在被修改的数据

        直到提交或回滚了事务之后,其他用户才可以更新数据

    分类:行级锁和表级锁

*/

-- 行级锁:行级锁是一种排他的锁,防止其他事务修改此行

-- Oracle会自动在下列语句中使用行级锁

insert

update

delete

select ... for update -- 允许用户一次锁定多行记录进行更新

/*

    表级锁,使用命令显式的锁定表,应用表级锁的语法

    分类:1.行共享;2.共享;3.排他;4.行排他:5.共享行排他

    共享锁(SHARE)

       1.锁定表,仅允许其他用户查询表中的行

       2.禁止其他用户插入、更新和删除行

       3.多个用户可以同时在同一个表上应用此锁

    排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表

    死锁:

      当两个事务相互等待对方释放资源时,就会形成死锁

      Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁

 

*/

lock table tableName in mode MODE


/*

     分区:Oracle允许用户将一个表分成多个分区,与表的创建一起

     优点:1.用户可以执行查询,只访问其中特定的分区;

           2.将不同的分区存储在不同的磁盘,提高访问性能和安全性

           3.可以独立备份和恢复分区。

*/

-- 范围分区,以表中一个列或一组列的值得范围分区

-- 关键字:partition by range values  less than

create table person1(

       pid number primary key,

       birthday date

)

partition by range (birthday)(

      partition p1 values less than (to_date('1980-01-01','yyyy-mm-dd')),

      partition p2 values less than (to_date('1990-01-01','yyyy-mm-dd')),

      --partition p1 values less than (maxvalue)

)

insert into person1 values(1,'ysjian',to_date('1965-02-03','yyyy-mm-dd'));

insert into person1 values(2,'ysjian',to_date('1985-02-03','yyyy-mm-dd'));

insert into person1 values(3,'ysjian',to_date('1995-02-03','yyyy-mm-dd'));

select * from person1 partition(p2);

--散列分区:允许用户对不具有逻辑范围的数据进行分区,关键字:hash

--          通过在分区键上执行hash函数决定存储的分区,将数据平均分配到不同的分区

create table person2(

       pid number primary key,

       pname varchar2(20),

       birthday date

)

partition by hash(birthday)(

          partition p1,

          partition p2,

          partition p3,

)

--partitions 3;上面四个分区等价这个

-- 列表分区:允许用户将不相关的数据组织在一起,关键字:list,values

create table person3(

       pid number primary key,

       birthday date

       address varchar2(50)

)

partition by list(address)(

       partition hubei values('武汉','黄石','黄冈'),

       partition shanxi values('西安','渭南','宝鸡')

)

--复合分区,关键字:subpartition

create table person4(

       pid number primary key,

       birthday date

       address varchar2(50)

)

partition by range(birthday)

subpartition by hash(birthday)

subpartitions 4(

      partition p1 values less than (to_date('1980-01-01','yyyy-mm-dd')),

      partition p2 values less than (to_date('1990-01-01','yyyy-mm-dd')),

      partition p3 values less than (to_date('2000-01-01','yyyy-mm-dd'))

)