移动互联网站建设,黄石网站建设黄石,微信小程序开发技术,wordpress logo 太小MySQL-事务
1.什么是事务
举例#xff1a;想象炒菜的过程。
洗菜切菜炒菜装盘
我相信缺少任何任何一个步骤#xff0c;都不完美#xff01;#xff01;#xff01;可以将炒菜的过程理解为一个事务#xff0c;是一组操作的集合#xff0c;而MySQL中的事务也是如此。但…MySQL-事务
1.什么是事务
举例想象炒菜的过程。
洗菜切菜炒菜装盘
我相信缺少任何任何一个步骤都不完美可以将炒菜的过程理解为一个事务是一组操作的集合而MySQL中的事务也是如此。但在MySQL中定义了事务的一些特性。只有符合这些特征才能称之为MySQL事务它们保证了数据库在并发环境下的正确性和可靠性。
2.事务的特性
1.1原子性
在MySQL中事务像原子一样不可分割的要么都执成功要么都执行失败。事务中的SQL语句执行错误已经执行的SQL语句必须撤销回滚到事务执行之前的状态。
1.2一致性
指的是事务开始和结束前后数据库的完整性没有被破坏。例如转账前后双方的金额和是不会发生变化的保持一致
1.3持久性
事务一旦提交其执行的结果将持久化到数据库即使系统宕机也能恢复。
1.4.隔离性
表示多个事务可以同时执行互相隔离。
3.事务的分类
保存点保存点Savepoint是事务过程中的一个中间状态它可以在事务执行过程中被创建和命名。保存点允许事务回滚到某一状态。
3.1扁平事务
使用最频繁的事务存在一个隐式的保存点有且仅有这一个隐式保存点在开始事务时隐式创建的保存点。当然我们也可以在事务中自定义保存点。
-- 创建一个保存点
SAVEPOINT save_point_name;
-- 删除某个一保存点
release savepoint point_name;
-- 回滚到某一个保存点
ROLLBACK TO save_point_name;例如对商品表进行第一次修改设置保存点进行第二次修改回滚到设置的保存点然后提交。
-- 商品表如下
-------------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
-------------------------------------------------------------
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(32) | NO | | NULL | |
| count | int(10) unsigned | YES | | NULL | |
-------------------------------------------------------------begin;
update product set count 2500 where id 1;
savepoint p1;
-- 该条数据被回滚修改不生效
update product set count 2000 where id 1;
rollback to p1;
commit;扁平事务保存点的易失性带有保存点的扁平事务发生系统崩溃故障时保存点会消失一旦保存消失只能恢复到事务最开始的状态。
注意rollback不指定回滚的保存点将默认回滚到隐式保存点。
3.2链事务
链事务的本质是开启多个事务它们是独立提交的且处于同一层级提交一个事务时释放不需要的数据对象。在提交事务和开始下一个事务操作会合并成一个原子操作下一个事务可以看见上一个事务的执行结果。
commit和commit work的区别
complection_type设 set completion_type1;
complection_type0commit和commit work是一样的效果提交事务。complection_type1执行commit work/commit后会自动开启一个相同隔离级别的事务。complection_type2commit work/commit等同于commit and release事务提交后断开与服务器的连接并重新开启一个会话。
3.3嵌套事务
嵌套事务本质上也是多个事务嵌套执行由最外层的事务控制内层事务。内层事务也可以嵌套其他事务。可以看做它们是树形的具有父子关系。子事务可以提交也可以回滚回滚不会影响父事务只会影响当前事务但是提交操作不会立即生效需要最后和父事务同时提交。
4.事务的实现
1.redo
主要功能实现事务的持久性。
记录物理级别上的页修改当事务提交时必须先将事务的所有日志写入到redo日志文件进行持久化。
数据库存储数据的位置位于磁盘想要知道磁盘的内容我们需要将其加载到内存在内存中读取和操作数据。数据库对数据进行更改时需要将数据页加载到buffer pool缓存池在buffer pool中更改数据当buffer pool中的数据还没有同步到磁盘就会暂时和磁盘页的内容不一致这些未同步的数据页通常称之为脏页dirty page。如果出现数据库崩溃或者是宕机这些脏页的数据丢失从而失去了持久性。因此数据库需要一种机制来记录对数据的修改。即使数据发生故障也能进行恢复。
redo实现日志持久化的原理事务将这些修改操作写入redo log buffer准备提交事务时。系统会将redo log buffer中的修改操作写入redo log file。
2.undo
undo日志通过记录数据的历史版本和撤销操作信息方便数据进行回滚。
undo是逻辑日志当发生回滚时所有的修改都被逻辑取消了。InnoDB存储引擎回滚时它实际上做的是与之前相反的工作例如插入操作Innodb存储引擎会完成一个delete删除操作InnoDB存储引擎会执行一个insert操作update操作Innodb存储引擎会执行一个相反的update操作。
5.事务管理器
InnoDB的事务管理器是InnoDB数据库引擎的核心组件之一它负责协调和管理数据库事务的处理。
在MySQL中事务中对数据的锁定都是由事务管理器来管理的。当一个事务获取了对某一行的锁时该锁将一直保持有效直到事务结束提交或回滚才会被释放。
在事务执行期间如果其他事务尝试获取同一行的锁它将被阻塞直到当前事务释放对该行的锁为止。这样可以确保在一个事务执行期间其他事务无法修改该行从而保持了数据的一致性。
在事务提交或回滚时事务管理器将释放所有该事务所获取的锁。这样其他事务就可以获取这些锁并对数据进行修改。如果事务被回滚那么它对数据的修改将被撤销同时对数据的锁定也将被释放。