数据库特点、四大特征、并发事务引起的问题
数据库4个基本特点:
1.数据结构化
2.数据的共享性高,冗余度低,易扩充
3.数据独立性高
4.数据由DBMS统一管理和控制
特点:
共享性高,冗余度低,易扩充
结构化
数据库系统实现了整体数据的结构化,这是数据库的最主要的特征之一。这里所说的“整体”结构化,是指在数据库中的数据不再仅针对某个应用,而是面向全组织;不仅数据内部是结构化,而且整体式结构化,数据之间有联系。
共享性
数据的共享性高,冗余度低,易扩充,因为数据是面向整体的,所以数据可以被多个用户、多个应用程序共享使用,可以大大减少数据冗余,节约存储空间,避免数据之间的不相容性与不一致性。
独立性
数据独立性高
数据独立性包括数据的物理独立性和逻辑独立性。
物理独立性是指数据在磁盘上的数据库中如何存储是由DBMS管理的,用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样一来当数据的物理存储结构改变时,用户的程序不用改变。
逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,也就是说,数据的逻辑结构改变了,用户程序也可以不改变。
数据与程序的独立,把数据的定义从程序中分离出去,加上存取数据的由DBMS负责提供,从而简化了应用程序的编制,大大减少了应用程序的维护和修改。
数据由DBMS统一管理和控制
数据库的共享是并发的(concurrency)共享,即多个用户可以同时存取数据库中的数据,甚至可以同时存取数据库中的同一个数据。
DBMS必须提供以下几方面的数据控制功能:
数据的安全性保护(security)
数据的完整性检查(integrity)
数据库的并发访问控制(concurrency)
数据库的故障恢复(recovery)
数据库事物四大特性-ACID
目录:
1.原子性
2.一致性
3.隔离性
4.持久性
n 原子性:(Atomicity)
比较官方说法:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
理解:要么全部做,要么不做。
n 一致性:(consistency)
在事物开始以前,数据库处于一致性的状态,事物结束后,数据库也必须处于一致性的状态。
拿银行转账来说,一致性要求事务的执行不应改变A、B两个账户的金额总和。如果没有这种一致性要求,转账过程中就会发生钱无中生有,或者不翼而飞的现象。事务应该把数据库从一个一致性状态转换到另外一个一致性状态。
银行转账例子:
1. 数据库使用SQLSERVER
① :脚本:先创建一个account银行账户表:
|
实现方案1:
不考虑任何的条件,简单实现两个账户之间的转账操作。
参数:
@out_cardno:转出账户
@in_cardno:转入账户
@money:转账金额
|
出现问题:
转出账户”01”的只有1000块,但是却能够成功的转1200块,这样的做法是不可思议的。
实现方案2:
加入对转出账户的余额判断:
|
出现问题:
1.存储过程的参数从外部出入,但是不能确定参数的合法性,一旦参数出现问题,执行存储过程就可能发生错误,导致部分业务代码执行不成功,发生数据不一致的问题。
2.缺少事务控制的管理
实现方案3:
|
现实生活中的金融业务是相当复杂的,上面的几个方案只是模拟了最基本的情况,譬如,跨行之间的转账,同行不同区的转账这些都是具体的业务需求。要把这些业务都使用存储过程来实现的话,对我们的数据库开发人员来说,要求就更高了。
n 隔离性:(Isolation)
理解一:
事务的隔离性要求系统必须保证事务不受其他并发执行的事务的影响,也既要达到这样一种效果:对于任何一对事务T1和T2,在事务T1看来,T2要么在T1开始之前执行,要么在T1完成之后才开始执行,这样,每个事务都感觉不到系统中有并发事务执行。
理解二:
多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
n 持久性:(Durability)
指一个事务一旦被提交并且成功完成,它对数据库的改变必须是永久的,它对数据库的影响是永久性的。
即使是在系统遇到故障的情况下也不会丢失,数据的重要性决定了事物的持久性的重要。
数据库完整性
数据库完整性(Database Integrity)是指数据库中数据在逻辑上的一致性、正确性、有效性和相容性。数据库完整性由各种各样的完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。数据库完整性约束可以通过DBMS或应用程序来实现,基于DBMS的完整性约束作为模式的一部分存入数据库中。通过DBMS实现的数据库完整性按照数据库设计步骤进行设计,而由应用软件实现的数据库完整性则纳入应用软件设计。
并发事务引起的问题:
更新丢失:
两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
脏读:
脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。
例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。
不可重复读:
不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。
例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
幻读:
事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据
例如:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读。