mysql 核心事务特性

InnoDB核心特性-事务

1.什么是事务

主要针对DML语句(update,delete,insert)

1.一组数据操作执行步骤,这些步骤被视为一个工作单元:
	1)用于对多个语句进行分组
	2)可以在多个客户机并发访问同一个表中的数据时使用
	
2.所有步骤都成功或都失败
	1)如果所有步骤正常,则执行
	2)如果步骤出现错误或不完整,则回滚

2.事务演示

#1.创建一个表
mysql> create table jiaoyi(id int,name varchar(10),money int);

#2.插入数据
mysql> insert jiaoyi values(1,'qiudao',300),(2,'lhd',200);

#3.开启一个事务
mysql> begin;
mysql> update jiaoyi set money=400 where id=2;
mysql> update jiaoyi set money=100 where id=1;

#4.提交事务之前,再开一个窗口查看数据,数据没有发生改变
mysql> select * from jiaoyi;
+------+--------+-------+
| id   | name   | money |
+------+--------+-------+
|    1 | qiudao |   300 |
|    2 | lhd    |   200 |
+------+--------+-------+
2 rows in set (0.00 sec)

#5.提交事务
mysql> commit;

#6.再次到新窗口查看数据
mysql> select * from jiaoyi;
+------+--------+-------+
| id   | name   | money |
+------+--------+-------+
|    1 | qiudao |   100 |
|    2 | lhd    |   400 |
+------+--------+-------+
2 rows in set (0.00 sec)

#7.再次开启事务修改数据
mysql> begin;
mysql> update jiaoyi set money=-100 where id=1;
mysql> update jiaoyi set money=600 where id=2;
mysql> select * from jiaoyi;
+------+--------+-------+
| id   | name   | money |
+------+--------+-------+
|    1 | qiudao |  -100 |
|    2 | lhd    |   600 |
+------+--------+-------+
2 rows in set (0.00 sec)

#8.结束事务之前,由程序判断,发现money钱数不能为负数,所以这次修改数不符合逻辑,只能回滚
mysql> rollback;
mysql> select * from jiaoyi;
+------+--------+-------+
| id   | name   | money |
+------+--------+-------+
|    1 | qiudao |   100 |
|    2 | lhd    |   400 |
+------+--------+-------+
2 rows in set (0.00 sec)

3.事务的通俗理解

伴随着“交易”出现的数据库概念。

我们理解的“交易”是什么?
	1)物与物的交换(古代)
	2)货币现金与实物的交换(现代1)
	3)虚拟货币与实物的交换(现代2)
	4)虚拟货币与虚拟实物交换(现代3)

数据库中的“交易”是什么?
	1)事务又是如何保证“交易”的“和谐”?
	2)ACID

4.事务完整流程

#成功的事务
begin;
sql1;
sql2;
....
commit;

#失败的事务
begin;
sql1;
sql2;
....
rollback;

5.事务的特性(ACID)

Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。

Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。

Isolated(隔离性)
事务之间不相互影响。

Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。

6.事务的控制语句

#事务常用的语句
BEGIN:		开始一个新事务
COMMIT:		永久记录当前事务所做的更改
ROLLBACK:	回滚当前事务所做的更改

#事务指定回滚
SAVEPOINT:	分配事务过程中的一个位置,以供将来引用
ROLLBACK TO SAVEPOINT:取消在 savepoint 之后执行的更改
RELEASE SAVEPOINT:删除 savepoint 标识符

#自动提交
SET AUTOCOMMIT:为当前连接禁用或启用默认 autocommit 模式

7.自动提交

#临时关闭自动提交
mysql> set autocommit=0;

#永久关闭自动提交
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
autocommit=0

8.隐式提交

1.现在版本在开启事务时,不需要手工begin,只要你输入的是DML语句,就会自动开启事务。
2.有些情况下事务会被隐式提交
	1)在事务运行期间,手工执行begin的时候会自动提交上个事务
	2)在事务运行期间,加入DDL、DCL操作会自动提交上个事务
	3)在事务运行期间,执行锁定语句(lock tables、unlock tables)
	
	4)load data infile
	5)select for update
原文地址:https://www.cnblogs.com/xiaolang666/p/13897561.html