原子性(Atomicity):原子性指的是事务是一个不可分割的工作单位,事务中的所有操作要么全部完成,要么全部不完成,不存在部分完成的情况。如果事务中的任何一步操作失败,整个事务都会被回滚(Rollback
)到事务开始前的状态,以保证数据的一致性和完整性。
一致性(Consistency):一致性确保了当事务完成时,数据从一个一致性状态转换到另一个一致性状态。事务在执行前后,数据库的完整性约束没有被破坏,如主键、外键、触发器等约束条件依然有效。这保证了数据库的结构和数据在事务开始和结束时都是有效的。
隔离性(Isolation):隔离性指的是并发执行的事务之间是相互隔离的,一个事务的执行不应该受到其他事务的干扰。即使多个事务并发执行,各个事务之间也不会互相影响,每个事务看到的数据应该是一致的。数据库通过锁定机制来实现事务的隔离性,确保并发执行的事务不会相互干扰。
持久性(Durability):持久性指的是一旦事务提交,所做的修改将永久保存在数据库中,即使系统发生故障,如数据库崩溃、服务器宕机,也不应该丢失提交的数据。
能有一个主键
NULL
创建索引的sql语句:
-- 创建唯一索引: 创建唯一索引的列的值不能重复 -- create unique index on 表名(列名); create unique index index_test1 on tb_testindex(tid);
查看索引:
-- 查询数据表的索引 show indexes from tb_testindex; -- 查询索引 show keys from tb_testindex;
B-tree:因为B树不管叶子节点还是非叶子节点,都会保存数据,在单个节点存储容量有限的情况下,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
B+树:B+树和B树的区别在于非叶子节点不再存储数据,数据只存储在同一层的叶子节点上,且叶节点之间增加了链表,便于查询。
Hash:虽然可以快速定位,但是没有顺序,IO复杂度高。
二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。
红黑树:树的高度随着数据量增加而增加,IO代价高。
自动提交
步到数据库中。
事务管理
开启事务,就是关闭自动提交
start transaction
开启事务rollback
回滚事务commit
提交事务事务管理示例sql:
create database db_test3; use db_test3; # 库存表 create table stock( id int primary key auto_increment, name varchar(200), num int not null ) # 订单表 create table order_db( id int primary key auto_increment, name varchar(200) not null, price double, num int ); insert into stock(name,num) values('鼠标',10); insert into stock(name,num) values('键盘',20); insert into stock(name,num) values('耳机',30); # 开启事务 start transaction; # 操作1:扣减库存 update stock set num = num-1 where name = '鼠标'; select aaa; # 此处会执行失败 # 操作2:新增订单 insert into order_db(name,price,num) values('鼠标',20.5,1); # 事务回滚:清除缓存中的操作,撤销当前事务已经执行的操作 rollback; # 提交事务: 将缓存中的操作写入数据文件 commit;
MySQL数据库事务隔离级别:
读未提交(read uncommitted)
T2可以读取T1执行但未提交的数据;可能会导致出现脏读、不可重复读和幻读
脏读,一个事务读取到了另一个事务中未提交的数据
读已提交(read committed)
T2只能读取T1已经提交的数据;避免了脏读,但可能会导致不可重复度、幻读
不可重复度(虚读): 在同一个事务中,两次查询操作读取到数据不一致
例如:T2进行第一次查询之后在第二次查询之前,T1修改并提交了数据,T2进行第二次查询时读取到的数据和第一次查询读取到数据不一致。
可重复读(repeatable read)
T2执行第一次查询之后,在事务结束之前其他事务不能修改对应的数据,但可以操作其他数据;避免了不可重复读,但可能会导致幻读
幻读,T2对数据表中的数据进行修改然后查询,在查询之前T1向数据表中新增了一条数
据,就导致T2以为修改了所有数据,但却查询出了与修改不一致的数据(T1事务新增的数
据)
串行化(serializable)
同时只允许一个事务对数据表进行操作;避免了脏读、虚读、幻读问题
MySQL数据库默认的隔离级别为可重复读
上一篇:7.8~7.10练习
下一篇:Linux启动或重启mysql失败:Job for mysqld.service failed because the control process exited with erro(多种解决方法)