MySQL数据库|事务+用户和权限管理
事务什么是事务事务把一组SQL语句打包成一个整体要么全部成功要么全部失败事务的ACID特性Atomicity (原子性) Consistency (一致性) Isolation (隔离 性)和 Durability (持久性)原子性支持事务中最基本的一个特性要么全部成功要么全部失败执行失败会回滚到事务开始的状态就行没执行过一样一致性事务执行完成之后保证数据正确并且符合预期隔离性多个事务之间不能相互影响持久性不论数据库是否损坏都不会影响数据安全事务最终要保证一致性一致性是通过原子性隔离性和持久性来实现的为什么要使用事务数据库服务是一个网络安全服务可以同时支持多个客户端访问例如以张三转账为例张三的原余额为1000转账100完之后剩余900此时如果张三再跟别人转账会出现数据错误如下图所示此时要考虑两个会话之间的隔离性也就是说不能他们之间的修改操作不能相互影响正确的结果就方是会话2在会话1修改的结果上在进行更新为什么要使用事务事务具有ACID特性在使用数据库的过程中对于修改只要提交成功就可以安全保存只要回滚就可以恢复到事务之初如何去使用事务查看支持事务的存储引擎语法START TRANSACTION 或 BEGIN 开始一个新的事务COMMIT 提交当前事务并对更改持久化保存ROLLBACK 回滚当前事务取消其更改无论提交还是回滚事务都会关闭实例事务回滚之后事务中所有的修改都会回到事务开始之前也就是修改被撤销如果commit数据就会保存下来commit之后不能再回滚因为事务已经提交了数据就落盘了保存点语法ROLLBACK TO savapoint;在事务执行的过程中设置保存点回滚时指定保存点就可以把数据恢复到保存点的状态回滚到指定节点如果只写rollback那么数据就会回滚到事务最开始的状态同时关闭事务自动/手动提交事务默认情况下事务是自动开启和提交和回滚的一个事务中包含一条DML语句查看当前事务是否自动提交使用以下语句语法show variables like autocommit;可以通过以下语句设置事务为自动或手动提交设置事务自动提交方式一SET AUTOCOMMIT1;方式二SET AUTOCOMMITON;设置事务手动提交方式一SET AUTOCOMMIT0;方式二SET AUTOCOMMITOFF;注意只要使用 START TRANSACTION 或 BEGIN 开启事务必须要通过 COMMIT 提交才会持久 化与是否设置 SET autocommit 无关。手动提交模式下不用显示开启事务执行修改操作后提交或回滚事务时直接使用 commit 或 rollback已提交的事务不能回滚手动配置重启之后就会恢复成自动提交想要修改成永久的手动提交就要通过修改配置文件事务与数据事务时保证数据安全的事务的隔离性和隔离级别事务间不同程度的隔离称为事务的隔离级别,在MySQL的InnoDB引擎中事务 的隔离级别有四种,性能与安全更有所侧重READ UNCOMMITTED 读未提交READ COMMITTED 读已提交REPEATABLE READ 可重复读(默认)SERIALIZABLE 串行化安全性由低到高性能由高到低READ UNCOMMITTED 读未提交对应事务中事务A对数据进行了修改事务B访问了事务A还没有提交的数据这个情况叫做“脏读”事务B访问了事务Arollback的数据READ COMMITTED 读已提交事务A第一次查询了某条记录此事务B对这条记录进行了修改并提交了当事务A再次查询这条记录的时候发现与第一次的查询结果不一致这个现象叫做“不可重复读”REPEATABLE READ 可重复读(默认)事务A第一次查询了某个结果集那么B以相同的查询得到的结果集与第一次不一样这个现象就叫做“幻读”两次同样的查询的结果得到的结果集不同InnDB存储引擎中使用了next-key锁锁住了目标行和之间的间隙解决了部分的幻读问题SERIALIZABLE 串行化解决了所有的数据安全问题所有事务都是一个埃一个的执行一个事务必须要等到上一个事务执行完成查看和设置隔离级别全局作用域SELECT GLOBAL.transaction_isolation;会话作用域SELECT SESSION.transaction_isolation;设置事务的隔离级别和访问模式可以使用以下语法方式一SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离等级;方式二SET GLOBAL[/GLOBAL.] transaction_isolation 隔离等级;注意方式中的隔离等级存在空格要用横线替换不同隔离级别存在的问题读未提交与脏读读已提交与不可重复读事务A先对某条数据进行了查询之后事务 B对这条数据进行了修改并且提交( COMMIT )事务事务A再对这条数据进行查询时得到了事务B 修改之后的结果可重复读与幻读用户和权限管理用户由两个部分构成一个是主机名一个是用户鸣有序从localhost主机以root用户名登录MySQL服务器host 允许登录的主机相当于白名单如果是localhost表示只能从本机登陆user 用户名*_priv 用户拥有的权限authentication_string 加密后的用户密码权限与授权语法grant priv_type[, priv_type ...] on priv_level to user_namehost_name [WITH GRANT OPTION]回收权限语法REVOKE [IF EXISTS] priv_type[, priv_type] ... ON priv_level FROM user_namehost_name [, user_namehost_name] ...