您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Mysql学习笔记(017)-事务

bubuko 2022/1/25 20:07:44 mysql 字数 27560 阅读 886 来源 http://www.bubuko.com/infolist-5-1.html

事务 1 #TCL 2 /* 3 Transanction Control Language 事务控制语言 4 事务: 5 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。 6 7 案例:转账 8 9 张三丰 1000 10 郭襄 1000 11 12 13 upda ...

事务

  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界面的查询都是一个连接,

 

案例讲解

小结

Mysql学习笔记(017)-事务

原文:https://www.cnblogs.com/landerhu/p/12427849.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶