mysql学习笔记——事务

文章目录

  • 什么是事务
  • 事务机制的原理(简单理解)
  • 事务的四特性(原子、一致、隔离、持久)
  • 事务的隔离性(四隔离级别)
  • mysql中演示事务和事务隔离性
    • 一些常用命令

什么是事务

一个事务是一个完整的业务逻辑单元,不可再分。事务的存在是为了保证数据的完整性、安全性。

案例:实现银行账户转账业务,A向B转100元。
实现:两条update语句,A-100,B+100。

update t_act set balance = balance - 100 where actno = 'A';
update t_act set balance = balance + 100 where actno = 'B';

此业务中,上述两条DML语句必须同时成功或同时失败。这就需要用到“事务机制”

ps:
1.和事务相关的语句:DML语句(insert、delete、update)
WHY:因为DML语句与数据库的数据有关,事务机制就是为了保证数据的完整性、安全性。
2.如果所有业务都可以用一条DML语句完成那么还需要事务机制吗?
不需要。

事务机制的原理(简单理解)

举例:完成一个业务需要三条DML语句:A添加、B修改、C删除。

开启事务机制
执行A:执行成功后,将执行记录到数据库的操作历史中,并不真正添加数据
执行B:执行成功后,将执行记录到数据库的操作历史中,并不真正修改数据
执行C:执行成功后,将执行记录到数据库的操作历史中,并不真正删除数据
结束事务机制:提交事务或回滚事务
提交事务:将数据持久化到硬盘,清空操作历史数据
回滚事务:硬盘数据不改变,清空操作历史数据

简单理解就是DML语句A、B、C捆绑在一起,ABC要么同时成功,要么同时失败。

  • TCL命令:
    commit(提交)
    rollback(回滚)
    savepoint(保存点)

事务的四特性(原子、一致、隔离、持久)

  • 原子性:事务是最小单元不可再分。通过undolog实现
  • 持久性:最终数据必须持久化到硬盘中,事务才算成功。通过redolog实现
  • 隔离性:事务与事务之间具有隔离性。通过(读写锁+MVCC)来实现
  • 一致性:事务必须保持多条DML语句同时成功或同时失败。通过原子性,持久性,隔离性共同实现。

事务的隔离性(四隔离级别)

特点(以同时处理相同表数据的事务A与事务B来举例)
第一级别:read uncommitted 读未提交。A未提交,B也可以看到A未提交的数据,所以会看到脏数据,脏数据是不稳定的。
第二级别:read committed 读已提交。A提交了,B就可以看到,B进行时总受A影响,原始数据一经A修改并提交,那么B就不可再看到原始数据,此为不可重复读
第三级别:repeatable read 可重复读。A提交了,B也提交了,B才可以看到。A与B同时进行时不受对方视觉上的影响,但看到的原始数据是幻象。系统对幻象数据的处理命令也不会报错。
第四级别:serializable 序列化/串行化读。A和B不可以同时处理同一数据,要排队,解决上述所有问题,但效率低

隔离级别越高,数据库事务并发执行性能越差,能处理的操作越少。所以一般地,推荐使用REPEATABLE READ级别保证数据的读一致性。对于幻读的问题,可以通过加锁来防止。

数据库 支持的隔离级别 默认的隔离级别
MYSQL 四种 repeatable read
ORACLE 只read committed、serializable read committed

mysql中演示事务和事务隔离性

一些常用命令

//mysql中事务是自动提交的,每执行一条DML就提交一次。
start transaction;      //关闭自动提交(每次commit后要重新关闭)
commit;         //手动提交命令
rollback;           //回滚到上一个commit
set global transaction isolation level 级别;//设置隔离级别,后需重启mysql
select @@global.tx_transaction; //察看隔离级别

演示read committed:

mysql学习笔记——事务_第1张图片
mysql学习笔记——事务_第2张图片
演示repeatable read:
mysql学习笔记——事务_第3张图片

演示都大同小异~就不放贴图啦

你可能感兴趣的:(MYSQL自用学习笔记,mysql,数据库)