美文网首页
mysql 事务

mysql 事务

作者: 哈斯勒 | 来源:发表于2019-08-27 16:52 被阅读0次
/*
 事务:
     由单独单元的一个或多个SQL语句组成,
     在这个单元中,每个SQL语句是相互依靠的。而整个单独单元作为一个不可分割的整体,
     如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。
     所有受影响的数据降返回到事务开始以前的状态;
     如果单元中的所有SQL语句均执行成功,则事务被顺利执行

 事务的acid属性:
     1.原子性(atomicity)
       事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
     2.一致性(consistency)
       事务必须使数据库从一个一致性状态发展到另外一个一致性状态
     3.隔离性(isolation)
       一个事务的执行不能被其他事务干扰,
       即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,
       并发执行的各个事务之间不能互相干扰
     4. 持久性(durablity)
       一个事务一旦被提交,它对数据库中数据的改变就是永久性的
       接下来的其他操作和数据库故障不应该对其有任何影响
 
 常见的并发问题:
     对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
     脏读: 
          对于两个事务T1,T2,T1读取了已经被T2更新但还没有提交的字段之后,若T2回滚,T1读取到的内容就是临时且无效的
     不可重复读:
          对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了
     幻读:
         对于两个事务T1,T2,T1从一个表中读取了一个字段,然后在该表中插入了一些新的行,
         之后,如果T1再次读取同一个表,就会多出几行
  
  事务隔离级别:
            脏读  幻读  不可重复读
  read uncommitted  √   √   √
  read committed    ×   √   √   (oracle)
  repeatable read   ×   ×   √  (mysql默认)
  serializable      ×   ×   ×
  
  
  隔离级别:
     每启动一个mysql程序,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别
     查看当前的事务隔离级别:
    SELECT @@tx_isolation;
     设置当前mysql连接的隔离级别:有4种
        SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
     设置数据库系统的全局的隔离级别:
        set global transaction isolation level read committed;
     
 存储引擎:
     查看: show engines;
     在mysql中用的最多的存储引擎有:innodb,myisam,memory等
     其中innodb支持事务
     
 事务创建:
    隐式事务:事务没有明显的开启和结束的标记
    比如 insert update delete
    
    显式事务:事务具有明显的开启和结束的标记
    前提:必须先设置自动提交功能为禁用状态 
    SHOW VARIABLES LIKE '%autocommit%'   
    set autocommit = 0; # 只针对当前会话有效
 步骤:
    1.开启事务
      set autocommit = 0;
      start transaction; # 可选
    2.编写事务中的sql语句(select insert update delete)
      语句1;
      语句2;
    3.结束事务
      commit;#提交事务
      rollback;#回滚事务
    savepoint; 设置保存点
    
*/

SHOW ENGINES;

SHOW VARIABLES LIKE '%autocommit%'

DROP TABLE IF EXISTS account;
CREATE TABLE account(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20),
    balance DOUBLE
);
INSERT INTO account(username,balance)
VALUES
('张无忌',1000),('赵敏',1000);

SET autocommit = 0;
START TRANSACTION;
UPDATE account SET balance = 1000 WHERE username = '张无忌';
UPDATE account SET balance = 1000 WHERE username = '赵敏';
ROLLBACK;
COMMIT;

SELECT * FROM account;


SELECT @@tx_isolation;

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

#savepoint
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a; #回滚到保存点

  #delete 和 truncate在事务使用时的区别
  #delete
  SET autocommit = 0;
  START TRANSACTION;
  DELETE FROM account;
  ROLLBACK; #可回滚成功
  
  #truncate
  SET autocommit = 0;
  START TRANSACTION;
  TRUNCATE FROM account;
  ROLLBACK; #回滚失败

相关文章

网友评论

      本文标题:mysql 事务

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