主要针对DML语句(update,delete,insert)
1.一组数据操作执行步骤,这些步骤被视为一个工作单元:
1)用于对多个语句进行分组
2)可以在多个客户机并发访问同一个表中的数据时使用
2.所有步骤都成功或都失败
1)如果所有步骤正常,则执行
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)
伴随着“交易”出现的数据库概念。
我们理解的“交易”是什么?
1)物与物的交换(古代)
2)货币现金与实物的交换(现代1)
3)虚拟货币与实物的交换(现代2)
4)虚拟货币与虚拟实物交换(现代3)
数据库中的“交易”是什么?
1)事务又是如何保证“交易”的“和谐”?
2)ACID
#成功的事务
begin;
sql1;
sql2;
....
commit;
#失败的事务
begin;
sql1;
sql2;
....
rollback;
Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。
Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
Isolated(隔离性)
事务之间不相互影响。
Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。
#事务常用的语句
BEGIN: 开始一个新事务
COMMIT: 永久记录当前事务所做的更改
ROLLBACK: 回滚当前事务所做的更改
#事务指定回滚
SAVEPOINT: 分配事务过程中的一个位置,以供将来引用
ROLLBACK TO SAVEPOINT:取消在 savepoint 之后执行的更改
RELEASE SAVEPOINT:删除 savepoint 标识符
#自动提交
SET AUTOCOMMIT:为当前连接禁用或启用默认 autocommit 模式
#临时关闭自动提交
mysql> set autocommit=0;
#永久关闭自动提交
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
autocommit=0
1.现在版本在开启事务时,不需要手工begin,只要你输入的是DML语句,就会自动开启事务。
2.有些情况下事务会被隐式提交
1)在事务运行期间,手工执行begin的时候会自动提交上个事务
2)在事务运行期间,加入DDL、DCL操作会自动提交上个事务
3)在事务运行期间,执行锁定语句(lock tables、unlock tables)
4)load data infile
5)select for update