事务
1 #TCL 2 /* 3 Transanction Control Language 事务控制语言 4 事务: 5 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。 6 7 案例:转账 8 9 张三丰 1000 10 郭襄 1000 11 12 13 update 表 set 张三丰的余额=500 where name=‘张三丰‘ 14 意外 15 update 表 set 郭襄的余额=1500 where name=‘郭襄‘ 16 17 18 事务的特性: 19 ACID 20 原子性:一个事务不可再分割,要么都执行要么不执行 21 一致性:一个事务执行回事数据从一个一致状态切换到另一个一致状态 22 隔离性:一个事务的执行不受其他事务的干扰 23 持久性:一个事务一旦提交,则会永久的改变数据库的数据。 24 25 26 27 事务的创建 28 隐式事务,事务没有明显的开启和结束标记 29 比如insert、update、delete语句 30 31 delete from 表 where id=1; 32 33 显示事务:事务具有明显的开启和结束标记 34 前提,必须要设置自动提交功能为禁用 35 36 set autocommit=0;#值针对当前会话 37 38 步骤1:开启事务 39 set autocommit=0; 40 start transaction;可选的 41 步骤2: 编写事务中的SQL语句(select insert update delete) 42 语句1; 43 语句2; 44 ... 45 46 步骤3:结束事务 47 commit;提交事务 48 rollback;回滚事务 49 50 savepoint 节点名:设置保存点 51 52 事务的隔离级别 53 脏读 幻读 不可重复读 54 read uncommitteed: √ √ √ 55 read committed: × √ √ 56 repeatable read: × × √ 57 serialable × × × 58 mysql中默认 第三个隔离级别 repeatable read 59 oracle中默认第二个隔离级别 read committed 60 查看隔离级别 61 select @@tx_isolation; 62 设置隔离级别 63 set session|global transaction isolation level 隔离级别; 64 65 66 开始事务的语句; 67 update 表 set 张三丰的余额=500 where name=‘张三丰‘ 68 意外 69 update 表 set 郭襄的余额=1500 where name=‘郭襄‘ 70 结束事务的语句; 71 72 */ 73 74 SHOW VARIABLES LIKE ‘autocommit‘; 75 76 77 SHOW ENGINES; 78 79 #演示事务的使用步骤 80 DROP TABLE IF EXISTS account; 81 82 CREATE TABLE account( 83 id INT PRIMARY KEY AUTO_INCREMENT, 84 username VARCHAR(20), 85 balance DOUBLE 86 ); 87 88 INSERT INTO account(username,balance) 89 VALUES(‘张无忌‘,1000,),(‘赵敏‘,1000); 90 91 #开启事务 92 SET autocommit=0; 93 START TRANSACTION; 94 #编写一组事务的语句 95 UPDATE account SET balance = 1000 WHERE username=‘张无忌‘; 96 UPDATE account SET balance = 1000 WHERE username=‘赵敏‘; 97 98 #结束事务 99 ROLLBACK; 100 #commit; 101 102 SELECT * FROM account; 103 #2.演示事务对于delete和truncate的处理的区别 104 105 SET autocommit=0; 106 START TRANSACTION; 107 108 DELETE FROM account; 109 ROLLBACK; 110 111 #3.演示savepoint的使用 112 SET autocommit=0; 113 START TRANSACTION; 114 DELETE FROM account WHERE id=25; 115 SAVEPOINT a;#设置保存点,只能搭配rollback使用 116 DELETE FROM account WHERE id=28; 117 ROLLBACK TO a;#回滚到保存点 118 119 120 SELECT * FROM account; 121 122 123 124 125 126 #################################################### 127 128 #案例讲解(命令行下) 129 #################命令行1################## 130 SELECT @@tx_isolation; 131 132 SET SESSION tranction ISOLATION LEVEL READ UNCOMMITTED;#最低的,重新或新连接就会重置 133 USE test; 134 SELECT * FROM account;#中文乱码 135 SET NAMES gbk; 136 SELECT * FROM account; 137 SET autocommit=0; 138 UPDATE account SET username=‘john‘ WHERE id=25; 139 ##############命令行2################### 140 SELECT @@tx_isolation;#查看当前隔离级别 141 142 SET SESSION tranction ISOLATION LEVEL READ UNCOMMITTED;#最低的,重新或新连接就会重置 143 USE test; 144 SELECT * FROM account;#中文乱码 145 SET NAMES gbk; 146 SELECT * FROM accou nt; 147 #在命令行1未commit的时候,显示张无忌变成john,此时脏读 148 #在命令行1提交rollback后再查,显示john变回来张无忌,这种现象称为不可重复读和幻读 149 # 150 151 #案例2 读已提交,避免了脏读,避免不了其他的 152 #终端1 153 SET SESSION tranction ISOLATION LEVEL READ COMMITTED; 154 SET autocommit=0; 155 UPDATE account SET username=‘张飞‘ WHERE id=25; 156 #终端2 157 SET SESSION tranction ISOLATION LEVEL READ COMMITTED; 158 SET autocommit=0; 159 SELECT * FROM account; 160 #终端2查询是没有查到还没提交的update 张飞,二次查询确实为张飞,不可重复读的问题 161 162 #案例3 幻读解决不了 163 #终端1 164 SET SESSION tranction ISOLATION LEVEL REPEATABLE READ; 165 SET autocommit=0; 166 UPDATE account SET username=‘刘备‘ WHERE id=25; 167 #commit; 168 #终端2 169 SET SESSION tranction ISOLATION LEVEL READ COMMITTED; 170 SET autocommit=0; 171 SELECT * FROM account; 172 #终端2在读的过程中没有发生变化,即使终端1提交了也是没有,直到终端2提交了,重开再查询,返回新值 173 174 #案例4 175 #终端1 176 SET SESSION tranction ISOLATION LEVEL REPEATABLE READ; 177 SET autocommit=0; 178 SELECT * FROM account;#得到的是2个结果 179 UPDATE account SET username=‘mmm‘ 180 #commit; 181 #终端2 182 SET SESSION tranction ISOLATION LEVEL REPEATABLE READ; 183 SET autocommit=0; 184 INSERT account VALUES(NULL,‘关于‘,1000) 185 #终端2提交完成后,终端1update发现返回3个结果。出现了幻读,幻读是针对插入的 186 187 #案例5 188 #终端1 189 SET SESSION tranction ISOLATION LEVEL SERIALIZABLE; 190 SET autocommit=0; 191 SELECT * FROM account;#得到的是4个结果 192 UPDATE account SET username=‘mmmmmmmmmm‘ 193 #commit; 194 #终端2 195 SET SESSION tranction ISOLATION LEVEL SERIALIZABLE; 196 SET autocommit=0; 197 INSERT account VALUES(NULL,‘关羽‘,2000) 198 #终端2在执行插入插入的时候,一直等待(会有超时机制)终端1在释放锁,终端1提交完成后,终端2可操作 199 #性能比较低 200 #ui界面的查询都是一个连接,
案例讲解
小结
原文:https://www.cnblogs.com/landerhu/p/12427849.html
如果您也喜欢它,动动您的小指点个赞吧