什么是事务?

事务是伴随交易类的业务出现的工作机制。 保证交易的完整性(和谐) 什么是交易? 计算机中的算数计算。 举例: 开启事务,同时两项操作 a账户100元,1~update a-100元(两个结果,要么发送成功要么失败回滚) b账户0元 , 2~update b+100元 事务结束。

也就是事务内的操作 要么都成功 要么都失败 不能 转账的时候 你的钱减了 但是我这里没加上


事务的特性:(重点)----ACID

Atomic(原子性): 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚;对于一个事务来说,不可能只执行其中的一部分操作,所有标准事务语句(DML语句),要么成功要么回滚。

Consistent(一致性): 如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。 事务发生前中后应该保证数据是始终一致性状态。

换一种方式理解就是:事务按照预期生效,数据的状态和我预期的状态一致

举例说明:张三向李四转100元,转账前和转账后的数据是正确的状态,这就叫一致性,如果出现张三转出100元,李四账号没有增加100元这就出现了数据错误,就没有达到一致性。

Isolation(隔离性): 事务之间不相互影响。 mysql是一个多事务并发工作的系统。 在某个事务工作时,不能受到其他事务的影响。

【扩展】保证事务隔离性的方法:

1.读写锁
2. MVCC机制(undo log和ReadView-(快照)通过可见性判断算法实现了基本的MVCC,从而实现了事务的隔离)

Durable(持久性):

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。


事务的操作

begin;

xxxxxxxxxxxxx;------------sql语句 下同

yyyyyyyyyyyyyy;

zzzzzzzzzzzzzzz;

rollback;---------------(回滚全部操作)

commit;

说明:在5.5 以上的版本,不需要手工begin,只要你执行的是一个DML, 会自动在前面加一个begin命令。

也就是说 5.5以上版本 只需要 commit 就会提交前面的所有操作。

不过我的5.7 不加begin的时候 回滚参数有问题;

【原因】 当使用 DDL,DCL语句的时候 会触发隐式提交,祥见下面的隐式

事务控制语句部分

【注意】:

事务不可嵌套


自动提交:

select @@autocommit; set autocommit=0; set global autocommit=0; 注: 自动提交是否打开,一般在有事务需求的MySQL中,将其关闭 不管有没有事务需求,我们一般也都建议设置为0,可以很大程度上提高数据库性能 (1) set autocommit=0; set global autocommit=0; (2) vim /etc/my.cnf autocommit=0

在autocommit=1是在执行dml语句没有开启begin时,会自动打开begin dml语句执行完成时自动增加commit autocommit=1适用于非交易类业务场景。


隐式事务控制语句:

即便我们已经将 autocommit 变量的值改为 OFF 关闭事务自动提交了,在执行某些 SQL 语句的时候,MySQL 还是会将事务自动提交掉,这被称为 隐式提交

1.设置了autocommit=1产生隐式事务。2.ddl,dcl语句和锁定语句会触发隐式提交 用于隐式提交的 SQL 语句: begin a dml b ddl--------该语句导致隐式提交 自动添加commit

3.两个begin之间也会隐式提交

SET AUTOCOMMIT = 1

导致提交的非事务语句: DDL语句: (ALTER、CREATE 和 DROP) DCL语句: (GRANT、REVOKE 和 SET PASSWORD) 锁定语句:(LOCK TABLES 和 UNLOCK TABLES) 导致隐式提交的语句示例: TRUNCATE TABLE LOAD DATA INFILE SELECT FOR UPDATE

❗❗❗隐式提交的触发,与autocommit参数无关。

也就是不管有没有设置自动提交 那些语句都会导致隐式提交


隐式回滚:

会话断开或者被kill掉(数据库宕机,事务执行失败等)事务自动回滚。


innodb事务的ACID的如何保证?---------------》总结9-

前滚-恢复。白话:还没有做,根据日志继续把它做完。
回滚-撤销。白话:已经做了,根据日志取消刚才所做的。

innodb工作流程:

redo log redo作用:在ACID过程中,实现的是d的持久化作用,对于AC也有相应作用 redo日志位置::iblogfile0 iblogfile1中 redobuffer:数据页的变化信息+数据页的当前LSN号 LSN:日志序列号,磁盘数据页,内存数据页,redo buffer ,redolog

redo的刷新策略:

commit:刷新当前事务redobuffer到磁盘。 还会顺便将一部分redo buffer 中没有提交的事务日志刷新到磁盘 补充: redo存储的是事务工作过程中数据页变化,commit会立即写入磁盘(默认)日志落盘成功commit才成功。 正常流程工作中: 主要工作是提供快速持久化功能。 mysql出现异常时,主要提供前滚功能。(csr) 自动故障恢复。罗盘数据中日志未落盘,但是LSN高于原数据。 redo数据重新保持一致落盘。

事务的工作流程: 事务举例: begin; update t1 set A=2 where A=1; commit;