MySQL-事务

  事务是由一个或多个SQL语句组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部失败。

1、事务的四大特性ACID(重要)

  原子性、一致性、隔离性、持久性

原子性Atomicity

不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态

一致性Consistency

如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;

隔离性Isolation

事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度

持久性Durability

事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复

 

2、事务的组成

  SQL语句的分类:DML、DQL、TPL、DDL、DCL

事务

Transaction,也称工作单元

一组DML | SELECT语句 + 一个(TPL | DDL | DCL)语句

DML

Data manipulation language数据操作语言

对数据库中的数据进行一些简单操作,如增删改insert,delete,update

DQL

Data query language数据查询语言

DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块

TPL

Transaction process language事务处理语言

用来对组成事务的DML语句的操作结果进行确认(commit)或取消(rollback)

DDL

Data definition language数据定义语言

对数据库的某些对象进行管理,如create、alter、drop、truncate、rename等

DCL

Data control language数据控制语言

设置或更改数据库用户或角色权限的语句,Grant授权、revoke收回、deny拒绝

  DDL和DML的区分:

  DDL主要是指对数据库中的某些对象(database、table等)进行管理,建库建表、删库删表、更改表结构(设置约束、数据类型,DESC查看表结构,rename重命名)

  而DML主要是指对数据库中的数据进行一些简单的操作,如delete\update\insert\call

 

3、MySQL的事务处理方式

  MySQL的事务处理主要有两种方法:

  a). 用begin,rollback,commit来实现

  begin开始一个事务→rollback事务回滚→commit事务提交

  b). 直接用set改变MySQL的自动提交模式

  MySQL默认是自动提交的,你提交一个sql语句,就直接执行!通过

  Set autocommit = 0 禁止自动提交

  Set autocommit = 1 开启自动提交

  但要注意,当用 Set autocommit = 0 的时候,所有的SQL都将作为一个事务来处理,知道用commit或rollback结束,当结束这个事务的同时也开启了新的事务。

 

4、隐式结束和显式结束

隐式结束

隐式提交和隐式回滚

隐式提交

执行一个DDL语句  或者  执行一个DCL语句

隐式回滚

客户端强行退出、系统崩溃、客户端连接到服务器端异常中断

显式结束

显式提交和显式回滚

显式提交

使用commit命令,使事务全部生效

显式回滚

使用rollback命令,使事务全部取消

  从客户端正常退出(即执行exit/quit命令退出),这就执行了隐式提交

  从客户端强行退出(也就是直接叉掉),这就执行了隐式回滚

 

5、保存点

  如果在一个事务内,想要返回到一个指定位置 而不是事务的初始位置,则可以通过设置保存点来实现:

  Savepoint 保存点名称;   --定义一个保存点

  Rollback to 保存点名称;  --回滚到指定的保存点

  注意:以上两条语句都不会结束事务的执行

 

6、锁

  锁是在多用户并发访问和操作数据库时,保证数据一致性的一种机制。

  锁是由oracle自动管理的,如一个DML操作,Oracle默认的机制是在DML操作所影响的行记录上自动加锁,而不是给所有行都加锁。

  锁在被相关的操作申请并持有后,会一直保持到事务的结束,才会被释放。

  查询语句不会锁定任何记录,如在查询语句后+for update,则会锁定该查询所影响的行记录。

  Update emp set sal=sal+100 where deptno=10;    //在窗口1,给10号部门的员工增加1000的工资,此时将emp表中的10号部门的所有信息都加上锁了。

  在其他窗口/会话 查询10号部门的薪资,显示结果还是加薪前的状态;且不能更改10号部门的所有信息,所有的执行信息会等到1号窗口的事务结束后立即执行。

  在窗口1则可以看到加薪后的状态;当使用commit提交事务后,其他窗口查到的数据也是加薪后的状态了,并可以对10号部门的数据进行修改了。

 

  作者:kerwin-chyl

  文章链接:https:////www.cnblogs.com/kerwin-chyl

  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

posted @ 2020-03-07 23:40  Kerwin_chyl  阅读(111)  评论(0编辑  收藏  举报