
希望能帮助你还请及时采纳谢谢
1事务的原理
事务就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。MySQL事务处理只支持InnoDB和BDB数据表类型。
1事务的ACID原则
** 1(Atomicity)原子性**: 事务是最小的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用;
2(Consistency)一致性: 执行事务前后,数据保持一致;
3(Isolation)隔离性: 并发访问数据库时,一个事务不被其他事务所干扰。
4(Durability)持久性: 一个事务被提交之后。对数据库中数据的改变是持久的,即使数据库发生故障。
1缓冲池(Buffer Pool)
Buffer Pool中包含了磁盘中部分数据页的映射。当从数据库读取数据时,会先从Buffer Pool中读取数据,如果Buffer Pool中没有,则从磁盘读取后放入到Buffer Pool中。当向数据库写入数据时,会先写入到Buffer Pool中,Buffer Pool中更新的数据会定期刷新到磁盘中(此过程称为刷脏)。
2日志缓冲区(Log Buffer)
当在MySQL中对InnoDB表进行更改时,这些更改命令首先存储在InnoDB日志缓冲区(Log Buffer)的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。
3双写机制缓存(DoubleWrite Buffer)
Doublewrite Buffer是共享表空间的物理文件的 buffer,其大小是2MB.是一个一分为二的2MB空间。
刷脏 *** 作开始之时,先进行脏页**‘备份’** *** 作.将脏页数据写入 Doublewrite Buffer.
将Doublewrite Buffer(顺序IO)写入磁盘文件中(共享表空间) 进行刷脏 *** 作.
4回滚日志(Undo Log)
Undo Log记录的是逻辑日志.记录的是事务过程中每条数据的变化版本和情况.
在Innodb 磁盘架构中Undo Log 默认是共享表空间的物理文件的Buffer.
在事务异常中断,或者主动(Rollback)回滚的过程中 ,Innodb基于 Undo Log进行数据撤销回滚,保证数据回归至事务开始状态.
5重做日志(Redo Log)
Redo Log通常指的是物理日志,记录的是数据页的物理修改.并不记录行记录情况。(也就是只记录要做哪些修改,并不记录修改的完成情况) 当数据库宕机重启的时候,会将重做日志中的内容恢复到数据库中。
1原子性
Innodb事务的原子性保证,包含事务的提交机制和事务的回滚机制.在Innodb引擎中事务的回滚机制是依托 回滚日志(Undo Log) 进行回滚数据,保证数据回归至事务开始状态.
2那么不同的隔离级别,隔离性是如何实现的,为什么不同事物间能够互不干扰? 答案是 锁 和 MVCC。
3持久性
基于事务的提交机制流程有可能出现三种场景.
1 数据刷脏正常.一切正常提交,Redo Log 循环记录.数据成功落盘.持久性得以保证
2数据刷脏的过程中出现的系统意外导致页断裂现象 (部分刷脏成功),针对页断裂情况,采用Double write机制进行保证页断裂数据的恢复.
3数据未出现页断裂现象,也没有刷脏成功,MySQL通过Redo Log 进行数据的持久化即可
4一致性
从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性
2事务的隔离级别
Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别
脏读: 指一个事务读取了另外一个事务未提交的数据。
不可重复读: 在一个事务内读取表中的某一行数据,多次读取结果不同
虚读(幻读): 是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
2基本语法
-- 使用set语句来改变自动提交模式
SET autocommit = 0 /*关闭*/
SET autocommit = 1 /*开启*/
-- 注意:
--- 1.MySQL中默认是自动提交
--- 2.使用事务时应先关闭自动提交
-- 开始一个事务,标记事务的起始点
START TRANSACTION
-- 提交一个事务给数据库
COMMIT
-- 将事务回滚,数据回到本次事务的初始状态
ROLLBACK
-- 还原MySQL数据库的自动提交
SET autocommit =1
-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
课堂测试题目
A在线买一款价格为500元商品,网上银行转账.
A的yhk余额为2000,然后给商家B支付500.
商家B一开始的yhk余额为10000
创建数据库shop和创建表account并插入2条数据
*/
CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci
USE `shop`
CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`cash` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO account (`name`,`cash`)
VALUES('A',2000.00),('B',10000.00)
-- 转账实现
SET autocommit = 0-- 关闭自动提交
START TRANSACTION -- 开始一个事务,标记事务的起始点
UPDATE account SET cash=cash-500 WHERE `name`='A'
UPDATE account SET cash=cash+500 WHERE `name`='B'
COMMIT-- 提交事务
# rollback
SET autocommit = 1-- 恢复自动提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
3事务实现方式-MVCC
1什么是MVCC
MVCC是mysql的的多版本并发控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVVC。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别为RR(可重复读)和RC(读提交)生效。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突,极大的增加了系统的并发性能。
2MVCC的实现机制
InnoDB在每行数据都增加两个隐藏字段,一个记录创建的版本号,一个记录删除的版本号。
在多版本并发控制中,为了保证数据 *** 作在多线程过程中,保证事务隔离的机制,降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被 *** 作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的;对于数据的更新(包括增删改) *** 作成功,会将这个版本号更新到数据的行中;事务提交成功,新的版本号也就更新到了此数据行中。这样保证了每个事务 *** 作的数据,都是互不影响的,也不存在锁的问题。
3MVCC下的CRUD
SELECT:
当隔离级别是REPEATABLE READ时select *** 作,InnoDB每行数据来保证它符合两个条件:
** 1 事务的版本号 大于等于 创建行版本号**
** 2 行数据的删除版本 未定义 或者大于 事务版本号**
【行创建版本号 事务版本号 行删除版本号】
INSERT:
InnoDB为这个新行 记录 当前的系统版本号。
DELETE:
InnoDB将当前的系统版本号 设置为 这一行的删除版本号。
UPDATE:
InnoDB会写一个这行数据的新拷贝,这个拷贝的版本为 当前的系统版本号。它同时也会将这个版本号 写到 旧行的删除版本里。
————————————————
版权声明:本文为CSDN博主「@Autowire」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zs18753479279/article/details/113933252
本系统中数据库的设计,要考虑和遵循下列数据库设计的基本原则,以建立稳定、安全、可靠的数据库。
1)一致性原则:对数据来源进行统一、系统的分析与设计,协调好各种数据源,保证数据的一致性和有效性。
2)完整性原则:数据库的完整性是指数据的正确性和相容性。要防止合法用户使用数据库时向数据库加入不合语义的数据。对输入到数据库中的数据要有审核和约束机制。
3)安全性原则:数据库的安全性是指保护数据,防止非法用户使用数据库或合法用户非法使用数据库造成数据泄露、更改或破坏。要有认证和授权机制。
4)可伸缩性与可扩展性原则:数据库结构的设计应充分考虑发展的需要、移植的需要,具有良好的扩展性、伸缩性和适度冗余。
5)规范化:数据库的设计应遵循规范化理论。规范化的数据库设计,可以减少数据库插入、删除、修改等 *** 作时的异常和错误,降低数据冗余度等。
数据库是整个软件应用的根基,是软件设计的起点,它起着决定性的质变作用,因此我们必须对数据库设计高度重视起来,培养设计良好数据库的习惯,是一个优秀的软件设计师所必须具备的基本素质条件!那么我们要做到什么程度才是对的呢?下面就说说数据库设计的原则:
1、数据库设计最起码要占用整个项目开发的40%以上的时间
数据库是需求的直观反应和表现,因此设计时必须要切实符合用户的需求,要多次与用户沟通交流来细化需求,将需求中的要求和每一次的变化都要一一体现在数据库的设计当中。如果需求不明确,就要分析不确定的因素,设计表时就要事先预留出可变通的字段,正所谓“有备无患”。
2、数据库设计不仅仅停留于页面demo的表面
页面内容所需要的字段,在数据库设计中只是一部分,还有系统运转、模块交互、中转数据、表之间的联系等等所需要的字段,因此数据库设计绝对不是简单的基本数据存储,还有逻辑数据存储。
3、数据库设计完成后,项目80%的设计开发在你脑海中就已经完成了
每个字段的设计都是有他必要的意义的,你在设计每一个字段的同时,就应该已经想清楚程序中如何去运用这些字段,多张表的联系在程序中是如何体现的。换句话说,你完成数据库设计后,程序中所有的实现思路和实现方式在你的脑海中就已经考虑过了。如果达不到这种程度,那当进入编码阶段后,才发现要运用的技术或实现的方式数据库无法支持,这时再改动数据库就会很麻烦,会造成一系列不可预测的问题。
4、数据库设计时就要考虑到效率和优化问题
一开始就要分析哪些表会存储较多的数据量,对于数据量较大的表的设计往往是粗粒度的,也会冗余一些必要的字段,已达到尽量用最少的表、最弱的表关系去存储海量的数据。并且在设计表时,一般都会对主键建立聚集索引,含有大数据量的表更是要建立索引以提供查询性能。对于含有计算、数据交互、统计这类需求时,还要考虑是否有必要采用存储过程。
5、添加必要的(冗余)字段
像“创建时间”、“修改时间”、“备注”、“ *** 作用户IP”和一些用于其他需求(如统计)的字段等,在每张表中必须都要有,不是说只有系统中用到的数据才会存到数据库中,一些冗余字段是为了便于日后维护、分析、拓展而添加的,这点是非常重要的,比如黑客攻击,篡改了数据,我们便就可以根据修改时间和 *** 作用户IP来查找定位。
6、设计合理的表关联
若多张表之间的关系复杂,建议采用第三张映射表来关联维护两张表之间的关系,以降低表之间的直接耦合度。若多张表涉及到大数据量的问题,表结构尽量简单,关联也要尽可能避免。
7、设计表时不加主外键等约束性关联,系统编码阶段完成后再添加约束性关联
这样做的目的是有利于团队并行开发,减少编码时所遇到的问题,表之间的关系靠程序来控制。编码完成后再加关联并进行测试。不过也有一些公司的做法是干脆就不加表关联。
8、选择合适的主键生成策略
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)