赞
踩
目录
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。如下A给B转钱的例子很形象的说明了事务的概念:
【举例】:还是用这个A给B转账的例子,在SQLyog中进行模拟开启事务、回滚、提交
- -- 创建表
- CREATE TABLE account (
- id INT PRIMARY KEY AUTO_INCREMENT,
- NAME VARCHAR(10),
- balance DOUBLE
- );
- -- 添加数据
- INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
-
- UPDATE account SET balance = 1000;
- SELECT * FROM account;
- -- 0. 开启事务
- START TRANSACTION;
- -- 1. 张三账户 -500
- UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
- -- 2. 李四账户 +500
- -- 出错了...
- UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
-
- -- 发现执行没有问题,提交事务
- COMMIT;
-
- -- 发现出问题了,回滚事务
- ROLLBACK;
1)在A窗口中先开启事务,然后执行张三账户-500,-》出错了-》李四账户+500,此时查询A窗口数据,张三确实-500,但李四还是100;在B窗口中查询数据,张三和李四都是1000,没发生变化;说明A窗口中开启事务起了作用,且A中查询的数据也只是暂时的。
2)发现错误后,执行回滚操作,再次在窗口A和B中查询,数据都是1000,回滚操作成功。
3)在A窗口中先开启事务,然后执行张三账户-500-》李四账户+500,此时查询A窗口数据,张三确实-500,李四+500;在B窗口中查询数据,张三和李四都是1000,没发生变化;因在A窗口中的操作都OK,执行提交事务,再次在窗口A和B中查询,数据都发生正确变化,事务提交成功。
1)事务提交的两种方式
2)修改事务的默认提交方式
实际上手动控制事务的开启与提交,可以大幅度提高数据插入的效率,在进行数据批量插入操作时可以手动控制事务。
1)原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败;
2)持久性:事务一旦提交或回滚,数据表的数据将被持久化的保存;
3)隔离性:多个事务之间相互独立;
4)一致性:表示事务操作前后,数据总量不变。
多个事务之间是隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别,就可以解决这些问题。
1)脏读:一个事务读取到另一个事务中没有提交的数据;
【举例】:A给B发1000块钱,手一抖打了10000,这个钱已经打到B的户口,但是事务还没有提交,这时B查下卡,发现多了9000,兴奋坏了,但是A及时发现,马上回滚差点提交的事务,将数字改回1000再提交。
2)不可重复读(虚读):在同一个事务中两次读取到的数据不一样;
【举例】:A拿着卡去购物,卡里有1000块钱,当A买单时(事务开启),收费系统事先检测到他的卡里有1000,就在这个时候,A的妻子要把钱全部拿出来买首饰,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待A的妻子转出金额事务提交完),A就会很郁闷,钱哪去了。。。
3)幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改;
【举例】:A去消费,花了1千元,A的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了1千元,就在这时,A又花了1千元买了一个机械键盘,即新增INSERT了一条消费记录,并提交。当妻子打印消费记录清单时(妻子事务提交),发现花了2千元,似乎出现了幻觉,这就是幻读。
1)read uncommitted:读未提交
【会产生的问题】:脏读、不可重复读、幻读
2)read committed:读已提交(Oracle默认)
【会产生的问题】:不可重复读、幻读
3)repeatable read:可重复读(MySQL默认)
【会产生的问题】:幻读
4)serializable:串行化
【会产生的问题】:可以解决所有问题
【注意】:隔离级别从小到大,安全性越来越高,但是效率越来越低。但是一般情况下不会修改数据库默认的隔离级别,只有在极特殊情况下才会做出修改已解决一些特殊问题。
数据库查询隔离级别:select @@tx_isolation;
数据库设置隔离级别:set global transaction isolation level 级别字符串;
———————————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有些许帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。