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