1 #TCL 2 /* 3 Transaction Control Language事务控制语言 4 事务: 5 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。 6 7 案例:转账 8 张三丰 1000 9 郭襄 1000 10 11 update 表 set 张三丰的余额=500 where name='张三丰'; 12 意外 13 update 表 set 郭襄的余额=1500 where name='郭襄'; 14 15 经典面试题: 16 事务的特性: 17 ACID 18 原子性:一个事务不可再分割,要么都执行要么都不执行 19 一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态 20 隔离性:一个事务的执行不受其他事务的干扰 21 持久性:一个事务一旦提交,则会永久的改变数据库的数据 22 23 事务的创建 24 隐式事务:事务没有明显的开启和结束的标记 25 比如insert、update、delete语句 26 27 delete from 表 where id=1; 28 29 显式事务:事务具有明显的开启和结束的标记 30 前提:必须先设置自动提交功能为禁用 31 32 set autocommit=0; 33 34 步骤1:开启事务 35 set autocommit=0; 36 start transaction;可选的 37 步骤2:编写事务中的sql语句(select insert update delete) 38 语句1; 39 语句2; 40 ... 41 42 步骤3:结束事务 43 commit;提交事务 44 rollback;回滚事务 45 46 47 savepoint 节点名;设置保存点 48 49 50 51 事务的隔离级别: 52 脏读 不可重复读 幻读 53 read uncommitted √ √ √ 54 read committed x √ √ 55 repeatable read x x √ 56 serializable x x x 57 mysql中默认 第三个隔离级别 repeatable read 58 oracle中默认第二个隔离级别 read committed 59 查看隔离级别 60 select @@tx_isolation; 61 设置隔离级别 62 set session|global transaction isolation level 隔离级别; 63 */ 64 65 SHOW ENGINES; 66 SHOW VARIABLES LIKE 'autocommit'; 67 68 #1.演示事务的使用步骤 69 DROP TABLE IF EXISTS account; 70 CREATE TABLE account( 71 id INT PRIMARY KEY AUTO_INCREMENT, 72 username VARCHAR(20), 73 balance DOUBLE 74 ); 75 76 INSERT INTO account(username,balance) 77 VALUES('张无忌',1000),('赵敏',1000); 78 #开启事务 79 SET autocommit=0; 80 START TRANSACTION; 81 #编写一组事务的语句 82 UPDATE account SET balance=1000 WHERE username='张无忌'; 83 UPDATE account SET balance=1000 WHERE username='赵敏'; 84 #结束事务 85 ROLLBACK; 86 #commit; 87 88 SELECT * FROM account; 89 90 #2.演示事务对于delete和truncate的处理的区别 91 92 #演示delete 93 SET autocommit=0; 94 START TRANSACTION; 95 96 DELETE FROM account; 97 ROLLBACK; -- 回滚可以恢复数据 98 99 #演示truncate 100 SET autocommit=0; 101 START TRANSACTION; 102 TRUNCATE TABLE account; 103 ROLLBACK; -- 回滚也不能恢复数据 104 105 #3.演示savepoint的使用 106 SET autocommit=0; 107 START TRANSACTION; 108 DELETE FROM account WHERE id=25; 109 SAVEPOINT a;#设置保存点 110 DELETE FROM account WHERE id=28; 111 ROLLBACK TO a;#回滚到保存点