1.什么是事务
1 2 3 4 5 6 7 8 9 |
主要针对DML语句(update,delete,insert) 1.一组数据操作执行步骤,这些步骤被视为一个工作单元: 1)用于对多个语句进行分组 2)可以在多个客户机并发访问同一个表中的数据时使用 2.所有步骤都成功或都失败 1)如果所有步骤正常,则执行 2)如果步骤出现错误或不完整,则回滚 |
2.事务的特性(ACID)
Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。
Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
Isolated(隔离性)
事务之间不相互影响。
Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。
3.事务周期
begin;
sql1;
sql2;
... ...
commit;
begin;
sql1;
sql2;
... ...
rollback;
4.事务的控制语句
1 2 3 4 5 |
begin; #开启一个事务 commit; #提交一个事务 rollback; #回滚一个事务 autocommit #自动提交 |
5.事务演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#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) |
6.事务完整流程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#成功的事务 begin; sql1; sql2; .... commit; #失败的事务 begin; sql1; sql2; .... rollback; |
7.事务的控制语句
1 2 3 4 5 6 7 8 9 10 11 12 |
#事务常用的语句 BEGIN: 开始一个新事务 COMMIT: 永久记录当前事务所做的更改 ROLLBACK: 回滚当前事务所做的更改 #事务指定回滚 SAVEPOINT: 分配事务过程中的一个位置,以供将来引用 ROLLBACK TO SAVEPOINT:取消在 savepoint 之后执行的更改 RELEASE SAVEPOINT:删除 savepoint 标识符 #自动提交 SET AUTOCOMMIT:为当前连接禁用或启用默认 autocommit 模式 |
8.自动提交
1 2 3 4 5 6 7 |
#临时关闭自动提交 mysql> set autocommit=0; #永久关闭自动提交 [root@db01 ~]# vim /etc/my.cnf [mysqld] autocommit=0 |
9.隐式提交
1.现在版本在开启事务时,不需要手工begin,只要你输入的是DML语句,就会自动开启事务。
2.有些情况下事务会被隐式提交
1)在事务运行期间,手工执行begin的时候会自动提交上个事务
2)在事务运行期间,加入DDL、DCL操作会自动提交上个事务
3)在事务运行期间,执行锁定语句(lock tables、unlock tables)
4)load data infile
5)select for update
事务的日志
作用
1 |
在事务ACID过程中,实现的是 "D" 持久化的作用。 |
工作原理
1 2 3 4 5 6 7 8 9 10 11 |
#1.修改数据时: 1)首先数据会从磁盘取出,加载到内存的data buffer page 2)操作数据,使用update语句修改数据,数据 2 变成 1 3)id=2变成id=1的变化过程会记录到redo buffer page中 4)当执行commit后,mysql会将redo buffer page中的变化过程写入磁盘的redo log中 #2.查询时: 1)执行select查询语句 2)数据 id=2 会从磁盘加载到data buffer page 3)并且将redo log中id=2变成id=1的变化过程取出到内存的redo buffer page中 4)通过data buffer page的数据和redo buffer page的变化过程,得到结果 id=1 |
事务中的锁
锁的类别
1 2 3 4 5 |
排他锁:在修改一条数据是,其他人不得修改 共享锁:保证在多事务工作期间,数据查询时不会被阻塞 乐观锁:多事务操作时,数据可以被同时修改,谁先提交,谁修改成功 悲观锁:多事务操作时,数据只有一个人可以修改 |
锁的粒度
1 2 |
MyISAM:表级锁 InnoDB:行级锁 |
事务的隔离级别
四种隔离级别
1 2 3 4 |
1.RU级别:READ UNCOMMITTED(未提交读),允许事务查看其他事务所进行的未提交更改 2.RC级别:READ COMMITTED,允许事务查看其他事务所进行的已提交更改 3.RR级别:REPEATABLE READ,允许事务查看其他事务所进行的已提交更改,需要重新登录数据库才能查看到提交的数据 4.串行化:SERIALIZABLE,将一个事务的结果与其他事务完全隔离 |
数据库专业名词
1 2 3 4 5 6 7 8 |
#1.脏读: 执行一个事务,还没有提交就被读取,可是事务回滚了,那么之前读到的数据就是脏数据 #2.幻读: 当删除一条数据时,刚删除,有别人插入同一条数据,我查看时以为是没有删除 #3.不可重复读 第一次读取数据和第二次读取数据之间数据被别人修改了,导致第一次读取的数据与第二次读取的数据不同 |
设置隔离级别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#1.查看隔离级别 mysql> show variables like '%iso%'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+ 1 row in set (0.00 sec) #2.设置数据库为RU级别 [root@db01 ~]# vim /etc/my.cnf [mysqld] transaction_isolation=read-uncommit #transaction_isolation=read-commit |