数据库基本概念

一、数据库的完整性

1、实体的完整性

实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人。

2、参照的完整性

参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性

3、域的完整性

域完整性是对数据表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值。

4、用户自定义的完整性

用户自定义完整性指针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如某个属性必须取唯一值,某个非主属性也不能取空值,某个属性的取值范围在0-100之间等。比如说一个表sutdent 属性有
id number,
name varchar2(8),
age number check(age between 10 and100);
其中的age定义了年龄的范围,这就是自定义完整性

5、如何保证数据库的完整性

(1)主键约束primary key:Primary key主键 指能唯一标识一条记录的单个数据表列或联合的数据表列(联合主键|复合主键)。主键用到的数据表列数据不能包含空值。而且,一张表只能包含一个主键。确保我们创建表内容实体的完整性,保证被设置的列不会出现重复值。
(2)唯一约束unique:除主键列外其他列各行数据不能重复时使用,其中表列可以包含空值。可以把unique唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的。但不能包含主键列。保证实体完整性不出现重复值。
(3)外键约束:外键用单个或多个字段作为外键。而外键约束就是引用字段必须在被引用字段中存在,除非引用字段部分为NULL或全部为NULL(由MATCH TYPE决定),否则INSERT或UPDATE时将返回失败,且被引用字段必须有唯一约束或是主键。作用主要是保证表与表之间的数据完整,即参照完整性。
(4)Check约束:是指约束表中某一个或者某些列中可接受的数据值或者数据格式。例如我们在表中创建手机号码列时,要求输入11位数字时,就可以这样设定防止多输或少输数字。这个主要是我们自定义数据的完整性。
(5)Default默认值约束:这个主要是定义我们一些自动默认值可以减少用户工作量的同时,减少失误率的产生。这个也是我们自定义数据完整性的作用。

二、数据库事物的四大特性ACID

1、原子性

事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;

2、一致性

事务结束后系统状态是一致的。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

3、隔离性

隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。

4、持久性

指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,不能回滚。接下来的其它操作或故障不应该对其执行结果有任何影响。

三、事物并发产生的影响

1、脏读

当第一个事务读取了第二个事务中已经修改但还未提交的数据,包括INSERT、UPDATE、DELETE,当第二个事务不提交并执行ROLLBACK后,第一个事务所读取到的数据是不正确的,这种读现象称作脏读。

事务T1在table1表中查询数据,得到id=1, ival=1的行,这时事务T2更新表中id=1的行的ival值为10,此时事务T1查询table1表,而事务T2此时并未提交,ival预期的值理应等于1,但是事务T1却得到了ival等于10的值。事务T2最终进行了ROLLBACK操作,很显然,事务T1将得到错误的值,引发了脏读现象。
Oracle目前不支持脏读,对于未提交的数据只能在本进程中查询,其他进程用户无法查询

2、不可重复读

当一个事务第一次读取数据之后,被读取的数据被另一个已提交的事务进行了修改,事务再次读取这些数据时发现数据已经被另一个事务修改,两次查询的结果不一致,这种读现象称为不可重复读。
时间点 T1 T2
1 select * from table1 where id=1;
2 update table1 set ival=10 where id=1;
Commit;
3 select * from table1 where id=1;
事务T1在table1表中第一次查询数据,得到id=1, ival=1的行,这时事务T2更新表中id=1的行的ival值为10,并且事务T2成功地进行了COMMIT操作。此时事务T1查询table1表,得到ival的值等于10,我们的预期是数据库在第二次SELECT请求的时候,应该返回事务T2更新之前的值,但实际查询到的结果与第一次查询得到的结果不同,由于事务T2的并发操作,导致事务T1不能重复读取到预期的值,这就是不可重复读的现象。

3、幻读

指一个事务的两次查询的结果集记录数不一致。例如一个事务第一次根据范围条件查询了一些数据,而另一个事务却在此时插入或删除了这个事务的查询结果集中的部分数据,这个事务在接下来的查询中,会发现有一些数据在它先前的查询结果中不存在,或者第一次查询结果中的一些数据不存在了,两次查询结果不相同,这种读现象称为幻读。幻读可以认为是受INSERT和DELETE影响的不可重复读的一种特殊场景。不可重复读和幻读很相似,它们之间的区别主要在于不可重复读主要受到其他事务对数据的UPDATE操作,而幻读主要受到其他事务INSERT和DELETE操作的影响。
时间点 T1 T2
1 select * from table1 where id>3 and id<10;
2 INSERT INTO table1(id) VALUES(5);
Commit;
3 select * from table1 where id>3 and id<10;
事务T1在table1 表中第一次查询id大于3并且小于10的数据,得到两行数据,这时事务T2在表中插入了一条id等于5的数据,这条数据正好满足事务T1的WHERE条件中,id大于3并且小于10的查询条件,事务T1再次查询时,查询结果会多一条非预期的数据,像产生了幻觉。

4、丢失更新

丢失更新就是两个不同的事务(或者Java程序线程)在某一时刻对同一数据进行读取后,先后进行修改。导致第一次操作数据丢失。可以用图表表示如下:

四、数据库的隔离级别

1、数据库的隔离级别

Serializable (串行化):最高级别,可避免脏读、不可重复读、幻读的发生;
Repeatable read (可重复读):可避免脏读、不可重复读的发生;mysql默认的隔离级别
Read committed (读已提交):可避免脏读的发生;oracle默认的隔离级别
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
隔离级别越高,并行效率越低。

2、oracle查看隔离级别

1):创建一个事物

declare
trans_id Varchar2(100);
begin
trans_id := dbms_transaction.local_transaction_id( TRUE );
end;

2):查看事物的隔离级别

SELECT s.sid, s.serial#,CASE BITAND(t.flag, POWER(2, 28))
WHEN 0 THEN ‘READ COMMITTED‘
ELSE ‘SERIALIZABLE‘ END AS isolation_level
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context(‘USERENV‘, ‘SID‘);

3、JDBC设置数据库事物的隔离级别

需要在开启事物之前

五、数据库的锁

1、oracle的两种锁机制

排它锁(exclusive lock):即X锁,加了排它锁的数据库对象不能被其他事物读取和修改
共享锁(share lock):即S锁,加了共享锁的数据库对象可以呗其他事物读取,但是不能被其他事物修改。

2、Oracle锁类型

(1)DDL锁:用于保护数据库对象的结构,如表、索引等的结构定义。
(2)DML锁:用于保护数据的完整性,能够防止同步冲突的DML和DDL操作破坏性交互
(3)内部锁和闩:保护数据库的内部结构,如数据文件,对用户是不可见的。

DML锁包括TM锁(表级锁)和TX锁(事务锁或行级锁)

3、悲观锁和乐观锁

悲观锁和乐观锁这两种策略的核心其实就是持有锁的时间的起止点不同,悲观锁是从读取记录的那一刻就开始了,而乐观锁只从UPDATE那一刻开始;结束的点两者是一样的,都是发出commit或rollback命令。所以,悲观锁策略会使锁的持续时间更长,而乐观锁的持续时间则较短。其影响就是并发。悲观锁的并发性低于乐观锁。
采取悲观锁策略的一个典型操作就是 select … for undate。通过这种操作,使得从我一开始查看该记录起,这条记录就被上了排它锁,不允许其它会话再对该记录有任何修改。

4、死锁

1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。

解决死锁:Kill session

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值