美文网首页
mysql事务134-138

mysql事务134-138

作者: kevinXiao | 来源:发表于2021-11-03 16:40 被阅读0次

    TCL

    /*
    Transaction Control Language 事务控制语言
    事务:
    一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
    案例:转账

    张三丰 1000
    郭襄 1000
    update 表 set 张三丰的余额=500 where name = '张三丰'
    意外
    update 表 set 郭襄的余额=1500 where name = '郭襄'
    事务的特性:
    原子性:一个事务不可再分割,要么都执行要么都不执行
    一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
    隔离性:一个事务的执行不受其他事务的干扰
    持久性:一个事务一旦提交,则会永久的改变数据库的数据

    事务的创建:
    隐式事务:事务没有明显的开启和结束的标记
    比如insert、update、delete语句
    delete from 表 where id = 1

    显示事务:事务具有明显的开启和结束的标记
    前提:必须先设置自动提交功能为禁用

    set autocommit = 0;
    步骤1:开启事务
    set autocommit = 0;
    start transaction;可选的
    步骤2:编写事务中的SQL语句 (select insert update delete)
    语句1;
    语句2;
    ...
    步骤3:结束事务
    commit;提交事务
    rollback;回滚事务

    开启事务的语句;
    update 表 set 张三丰的余额=500 where name = '张三丰'
    update 表 set 郭襄的余额=1500 where name = '郭襄'
    结束事务的语句;

    */


    image.png
    image.png

    演示事务的使用步骤

    开启事务

    set autocommit = 0
    start transaction;

    编写一组事务的语句

    update account set balance = 500 where username = '张无忌'
    update account set balance = 1500 where username = '赵敏'

    结束事务

    commit
    rollback

    数据库的隔离级别

    image.png

    查看当前默认的隔离级别

    select @@ex_isolation

    设置当前mysql连接的隔离级别

    set transaction isolation level read committed

    设置数据库系统的全局的隔离级别

    set global transaction isolation level read committed

    savepoint节点名:设置保存点

    不同事务隔离级别的区别:

    读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到
    读提交:一个事务提交之后,它所做的变更才可以被别的事务看到
    可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
    串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行

    image.png

    我们来看看在不同的隔离级别下,事务 A 会有哪些不同的返回结果,也就是图里面 V1、V2、V3 的返回值分别是什么。
    若隔离级别是“读未提交”, 则 V1 的值就是 2。这时候事务 B 虽然还没有提交,但是结果已经被 A 看到了。因此,V2、V3 也都是 2。
    若隔离级别是“读提交”,则 V1 是 1,V2 的值是 2。事务 B 的更新在提交后才能被 A 看到。所以, V3 的值也是 2。
    若隔离级别是“可重复读”,则 V1、V2 是 1,V3 是 2。之所以 V2 还是 1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。
    若隔离级别是“串行化”,则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。所以从 A 的角度看, V1、V2 值是 1,V3 的值是 2。

    read uncommitted读未提交数据 允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现。

    脏读;对于两个事务t1,t2,t1读取了已经被t2更新但还没有被提交的字段,之后,若t2回滚,t1读取的内容就是临时且无效的


    image.png

    read-commitled读已提交数据 ,只允许事务读取已经被其它事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能出现

    image.png

    repeatable read可重复读 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其它事务对这个字段进行更新,可以解决脏读和不可重复读,不能解决幻读

    image.png
    image.png

    repeatable read可重复读

    image.png

    serializable串行化确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其它事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下

    演示savepiont 的使用

    delete from account where id = 25
    savepoint a;设置保存点
    delete from account where id = 28
    rollback to a;回滚到保存点


    image.png

    相关文章

      网友评论

          本文标题:mysql事务134-138

          本文链接:https://www.haomeiwen.com/subject/tbxczltx.html