暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL事务

brevity分享 2021-09-09
146
在实际开发中,SQL中最常用的一种就是事务了,事务全称为Transaction Control Language,事务控制语言,简称TCL。上面说到的事务,它的概念就是:事务由单独单元的一个或多个SQL语句组成,在这个单元中每个SQL语句是互相依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事务开始以前的状态,如果单元中的所有SQL语句执行成功,则事务被顺利执行。在MySQL中InnoDB存储引擎支持事务,而MyISAM与MEMORY存储引擎不支持事务。显示MySQL储存引擎的SQL:
    SHOW ENGINES;
    执行结果如下图:

    事务有四个特点,简称ACID属性,具体是:原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生;一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态;隔离性(Isolation):事物的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰;持久性(Durability):持久性是指一个事务一旦被提交,他对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
    MySQL中事务是默认开启的,如果需要单独设置一段事务的代码,需要先设置事务关闭,再去编写SQL语句,具体SQL如下:
      SET autocommit = 0;
      START TRANSACTION; (可选)
      编写事务中的SQL语句(selectinsertupdatedelete)
      COMMIT; 提交事务
      ROLLBACK; 回滚事务
      事务成功就是提交事务,事务失败就是回滚事务。事务示例如下:
        # 事务提交
        SET autocommit = 0;
        START TRANSACTION;
        UPDATE account SET balance = 500 WHERE id = 1;
        UPDATE account SET balance = 2500 WHERE id = 2;
        COMMIT;
        -- 事务回滚
        SET autocommit = 0;
        START TRANSACTION;
        UPDATE account SET balance = 1500 WHERE username = '张三';
        UPDATE account SET balance = 3500 WHERE username = '李四';
        ROLLBACK;
        对于同时运行多个事务的情况,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致并发问题,具体导致的问题如下:脏读:对于两个事务T1、T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时无效的;不可重复读:对于两个事务T1、T2,T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了;幻读:对于两个事务T1、T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后,如果T1再次读取同一个表就会多出几行。为了保证数据库中事务的并发不出现问题,所以数据库有了隔离级别,一个事务与其他事务隔离的程度就是隔离级别,隔离级别越高,数据的一致性就越好,但并发性就越弱。MySQL支持下面的四种隔离级别。

        查看当前的隔离级别:
          SELECT @@tx_isolation;
          设置当前连接的隔离级别:
            SET TRANSACTION ISOLATION LEVEL 隔离级别;
            设置数据库系统的全局隔离级别:
              SET SESSION|GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
              设置事务的保存点(针对ROLLBACK使用):
                SET autocommit = 0;
                START TRANSACTION;
                DELETE FROM stuInfo WHERE id = 20;
                SAVEPOINT A; # 设置保存点
                DELETE FROM stuInfo WHERE id = 22;
                ROLLBACK TO A; -- 回滚到保存点
                运行结果是id=22没有被删除,而id=20的被删除了。
                文章转载自brevity分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论