用户直接修改数据库是非常危险的,数据库将拷贝的数据放到undo日志,undo日志将修改的数据记录到redo日志,再同步到数据库。
RDBMS=SQL语句+事务(ACID)
事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全部执行失败。.
默认情况下,MySQL执行每条SQL语句都会自动开启和提交事务,为了让多条SQL语句纳入到一个事务之下,可以手动管理事务:
START TRANSACTION; SQL 语句 [COMMIT(提交事务)| ROLLBACK (事务回滚,SQL语句无效)]
在手动开启事务的情况下,删除和修改的数据都在redo文件中,不是直接操作数据库的数据,需要commit才能和数据库文件进行同步。
事务的ACID属性:
1.原子性 2.一致性 3.隔离性 4.持久性
原子性:一个事务中的所有操作要么全部完成,要么全部失败。事务执行后,不允许停留在中间某个状态。
一致性:不管在任何给定的时间,并发事务有多少,事务必须保证运行结果的一致性。
隔离性:事务不受其他并发事务的影响,如同在给定的时间内,该事务是数据库唯一运行的事务。
持久性:事务一旦提交,结果便是永久性的。即便发生意外,依然可以依靠事务日志完成数据的持久化。
事务的四个隔离级别:
1. read uncommitted 读取未提交数据 2.read committed 读取已提交数据
3.repeatable 重复读取 4.serializable 序列化
1. read uncommitted 代表可以读取其他事务未提交的数据(买票)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
2.read committed 代表只能读取其他事务提交的数据(银行存取款)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
3.repeatable 代表事务在执行中反复读取数据,得到的结果是一致的,不会受其他事务影响(下单修改价格)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
4.serializable 由于事务并发执行所带来的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题了。(牺牲数据库的并发性,少用)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
数据导出的分类:
SQL文档/文本文档
导出SQL文件,使用mysqldump把业务数据导出成SQL文件,其中也包括了表结构
cmd: Mysqldump -uroot -p [no-data 表示只导出表结构] 逻辑库>路径
导入SQL文件:
sql > use demo; sql > source backup.sql;
Navicat图形界面操作:
转储表结构,导出表数据,运行SQL文件,导入表数据。当数据库字段值和数据很多的时候,跳过词法分析和语法优化,这样子效率高一点
AES加密函数:
MySQL数据库提供了AES加密和解密函数,所以数据的加密解密非常容易实现
AES_ENCRYPT(原始数据,密钥字符串) SELECT AES_ENCRYPT("你好世界","ABC123456"); SELECT HEX(AES_ENCRYPT("你好世界","ABC123456"));#HEX函数用于转16进制
AES解密函数:
AES解密要使用与加密相同的密钥,才能解密出原始数据
AES_DECRYPT(加密结果,密钥字符串) SELECT AES_DECRYPT( UNHEX("这里是16进制的加密结果"),
"和加密相同的密钥"
);