1)原子性
原子性是指事务包含的所有操作要么全部执行成功,要么全部失败进行回滚,因此数据的成功就要完全的应用到数据库,如果操作失败则不能对数据库有任何的影响
2)一致性
一致性是指事务必须使数据库从一个一致的状态变换到另外一个一致的状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态
举例:银行转账:如A账户和B账户两个账户加起来的钱是1000RMB,不管你进行多少次转账,始终在事务结束后A和B账户的总金额之和还应该是1000RMB,这就是事务的一致性。
3)隔离性
隔离性就是指多个用户并发访问数据的时候,比如操作同一张表,数据库为每一个用户开启的事务,不能被其他用户的事务所干扰,多个并发事务之间应该相互隔离。
即要达到的效果是:对于任意两个并发的事务T1和T2,在T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后再开始,这样的话就事务就不会觉察到有其他的事务在并发的执行。
4)持久性
持久性是指一旦一个事务被提交了,那么数据库中的数据改变就是永久的,即便是在数据库遇到了故障的情况下也不会丢失提交事务的操作。
例如我们在使用jdbc操作数据库时,在提交了事务后,提示用户操作完成,当用户看到提示完成后,就可以认定事务已经正确提交了,即使这个时候数据库出现了问题,也要将我们的事务执行完成,否则就会造成我们的提示完成,因为数据库故障而没有执行事务的重大错误。
有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。如何防止数据表出现重复数据及如何删除数据表中的重复数据?
1) 防止表中出现重复数据
在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。如果我们设置了主键或者唯一索引,那么在执行操作的时候就会抛出异常。
INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。那么使用了INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:
INSERT IGNORE INTO当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而REPLACE INTO into如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。
另一种设置数据的唯一性方法是添加一个UNIQUE索引2
CREATE TABLE person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
UNIQUE (last_name, first_name)
);
2)统计重复数据
统计表中 first_name 和 last_name的重复记录数:
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
以上查询语句将返回 person_tbl 表中重复的记录数。 一般情况下,查询重复的值,请执行以下操作:
数据库锁是网络数据库中一个非常重要的概念,它主要用于多环境下保证数据库完整性和一致性。各种大型的数据库采用大的锁的基本理论是一致的,只是在具体的实现上有差别。
1)共享锁
共享锁用于所有的只读操作,共享锁是非独占有的,允许多个并发事务读取其锁定的资源,默认情况下,数据被读取后,数据库立即释放共享锁。
例如:SELECT *FROM MY_TABLE,执行这条语句,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页,这样,在允许读的操作过程中,修改未锁定的第一行,但是,事务的隔离级别连接选项设置和SELECT语句中的锁定设置都可以改变数据库的默认设置,例如:SELECT *FROM MY_TABEL HOLDlOCK 要求在整个查询过程中,保持对表的锁定,直到查询完成才能完成锁定。
2) 修改锁
修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样就可以避免是用共享锁造成的死锁现象,因为使用共享锁的时候,操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为独占锁,然后再次执行修改操作,这样子,如果有两个或者多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些共享锁都升级为独占锁,这个时候这些事务都不会释放共享锁而是等待对方释放,这样就造成了死锁,如果一个数据在修改前直接申请了修改锁,在数据修改的时候在升级为独占锁,这样就可以避免死锁。修改锁和共享锁是兼容的,也就是说一个资源用共享锁定后,允许再用修改锁锁定。
3)独占锁
独占锁是为修改数据而保留的,它锁定的资源,其他事务不能修改也不能读取,独占锁不能和其他锁兼容。
1)MyISAM
.不支持事务,但是每次的查询都是原子的。
.支持表级锁,即每次的操作都是对表进行加锁。
.存储表的总行数。
.一个MYISAM表有三个文件,索引文件,表结构文件,数据文件,
.采用非聚集索引,索引文件的数据域存储指向数据文件的指针,辅索引与主索引基本一致,但是辅索引不用保证唯一性。
2)InnoDB
.支持ACID的事务,支持事务的四种隔离级别。
.支持行级锁及外键约束,因此可以支持写并发。
.不存储总行数。
.一个InnoDB存储在一个文件空间,也可能为多个,受操作系统文件大小的限制。
.主键采用聚集索引,辅索引的数据域存储主键的值,因此辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引,最好使用自增主键,防止插入数据,为维持B+树结构,文件的大调整。
3)主要区别
.MyISAM是非事务安全的,InnoDB是事务安全的。
.MyISAM锁的粒度是表级的,InnoDB是行级锁。
.MyISAM是支持全文类型索引,InnoDB不支持全文类型索引。
.MyISAM是相对简单,效率上要优于InnoDB,小型的应用可以考虑使用MyIASM 。
.MyISAM表保存成文件形式,跨平台使用更加方便。
4)应用场景
. MyIASM管理非事务表,提供高速存储和检索以及全文搜索能力,如果再应用中执行大量的select操作,应该选择MyIASM。InnoDB用于处理事务,具有ACID事务支持等特性,如果在应用中执行大量的insert和update操作,应该选择InnoDB。
数据库索引,是数据库管理系统一种排序的数据结构,为了方便快速查询,索引的实现通常使用B树索引和变种B+树索引。在数据库中,除了数据外,数据库系统还存在特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构,我们就称之为索引。
为表设置索引是要付出空间和时间山的代价的,第一,增加了数据库的村粗空间;第二,当数据要进行修改或者删除时候,所有的数据又要重新进行的排序,这样也增加了时间上的开销。
先举例说明:下图中,做表面是数据表,为了加快数据的查找,我们可以维护右边这样一个查找二叉树,每个节点分别包含一个索引键值和一个指向对应数据的物理地址的指针,这样我们就可以利用数据结构进行快速的查找。
1)B树和B+树
.B树中的每个节点包含了键值和键值对于数据对象存放地址指针,所以要成功搜索以个对象可以不用达到树的叶子节点,成功搜索包括节点内搜索和沿着某以路径搜索,成功搜索的时间取决于关键码所在层次以及节点内关键码的数量,在B树中查找给定关键字的方法是:首先把根节点取来,在根节点锁所包含的关键字K1。。。kj查找给的关键字,如果找到给定的关键字,就查找成功,否则,一定可以确定要查找的关键字在某个ki或ki+1之间,于是取下pi所指的下一层索引节点块继续查找,直到找到,或指针Pi为空时查找失败。