举例:想象炒菜的过程。
我相信缺少任何任何一个步骤,都不完美!!!可以将炒菜的过程理解为一个事务,是一组操作的集合,而MySQL中的事务也是如此。但在MySQL中定义了事务的一些特性。只有符合这些特征才能称之为MySQL事务,它们保证了数据库在并发环境下的正确性和可靠性。
在MySQL中事务像原子一样不可分割的,要么都执成功,要么都执行失败。事务中的SQL语句执行错误,已经执行的SQL语句必须撤销,回滚到事务执行之前的状态。
指的是事务开始和结束前后,数据库的完整性没有被破坏。(例如转账前后双方的金额和是不会发生变化的,保持一致)
事务一旦提交,其执行的结果将持久化到数据库,即使系统宕机也能恢复。
表示多个事务可以同时执行,互相隔离。
保存点:保存点(Savepoint)是事务过程中的一个中间状态,它可以在事务执行过程中被创建和命名。保存点允许事务回滚到某一状态。
使用最频繁的事务,存在一个隐式的保存点,有且仅有这一个隐式保存点,在开始事务时隐式创建的保存点。当然,我们也可以在事务中自定义保存点。
-- 创建一个保存点
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不指定回滚的保存点,将默认回滚到隐式保存点。
链事务的本质是开启多个事务,它们是独立提交的且处于同一层级,提交一个事务时,释放不需要的数据对象。在提交事务和开始下一个事务操作会合并成一个原子操作,下一个事务可以看见上一个事务的执行结果。
commit和commit work的区别:
complection_type:设 set @@completion_type=1;
嵌套事务本质上也是多个事务嵌套执行,由最外层的事务控制内层事务。内层事务也可以嵌套其他事务。可以看做它们是树形的具有父子关系。子事务可以提交也可以回滚,回滚不会影响父事务,只会影响当前事务,但是提交操作不会立即生效,需要最后和父事务同时提交。
主要功能:实现事务的持久性。
记录物理级别上的页修改,当事务提交时,必须先将事务的所有日志写入到redo日志文件进行持久化。
数据库存储数据的位置位于磁盘,想要知道磁盘的内容我们需要将其加载到内存,在内存中读取和操作数据。数据库对数据进行更改时,需要将数据页加载到buffer pool(缓存池),在buffer pool中更改数据,当buffer pool中的数据还没有同步到磁盘,就会暂时和磁盘页的内容不一致,这些未同步的数据页,通常称之为脏页(dirty page)。如果出现数据库崩溃或者是宕机,这些脏页的数据丢失,从而失去了持久性。因此数据库需要一种机制来记录对数据的修改。即使数据发生故障也能进行恢复。
redo实现日志持久化的原理:事务将这些修改操作写入redo log buffer,准备提交事务时。系统会将redo log buffer中的修改操作写入redo log file。
undo日志通过记录数据的历史版本和撤销操作信息,方便数据进行回滚。
undo是逻辑日志,当发生回滚时,所有的修改都被逻辑取消了。InnoDB存储引擎回滚时,它实际上做的是与之前相反的工作,例如插入操作,Innodb存储引擎会完成一个delete;删除操作,InnoDB存储引擎会执行一个insert操作;update操作,Innodb存储引擎会执行一个相反的update操作。
InnoDB的事务管理器是InnoDB数据库引擎的核心组件之一,它负责协调和管理数据库事务的处理。
在MySQL中,事务中对数据的锁定都是由事务管理器来管理的。当一个事务获取了对某一行的锁时,该锁将一直保持有效,直到事务结束(提交或回滚)才会被释放。
在事务执行期间,如果其他事务尝试获取同一行的锁,它将被阻塞,直到当前事务释放对该行的锁为止。这样可以确保在一个事务执行期间,其他事务无法修改该行,从而保持了数据的一致性。
在事务提交或回滚时,事务管理器将释放所有该事务所获取的锁。这样,其他事务就可以获取这些锁并对数据进行修改。如果事务被回滚,那么它对数据的修改将被撤销,同时对数据的锁定也将被释放。