-- TCL
/*
Transcation Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行 案例:转账
name 余额
麦克雷 1000
天使 1000 update 表 set 余额=500 where name = '麦克雷';
意外
update 表 set 余额=1500 where name = '天使'; 出现错误或执行失败,则回滚。3 SHOW ENGINES
可以看到只有InnoDB支持事物 事物的ACID属性
1.Atomicity 原子性:一个事务是不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.Consistency 一致性:事务必须使数据库从一个一致状态变成另一个一致性状态。例如转账完成后,余额的和还是2000。
3.Isolation 隔离性:一个事务的执行不受其他事务干扰,并发时各个事务之间不能互相干扰。
4.Druability 持久性:一个事务一旦被提交,它对数据库中的数据的改变是永久的。
*/ -- 隐式事务:事务没有明显的开始和结束标记 如insert,update,delete语句
SHOW VARIABLES LIKE 'autocommit'; -- 默认是自动开启的 -- 显式事务:事务具有明显的开启和结束的标记
/*
前提:必须先设置自动提交功能为禁用
set autocommit = 0;
开启事务 可选
start transaction
编写sql语句(select insert update delete)
语句1,
语句2,
...
结束事务
commit 提交事务
rollback 回滚事务
*/
CREATE TABLE IF NOT EXISTS 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 = 500 WHERE username = '麦克雷';
UPDATE account SET balance = 1500 WHERE username = '天使';
COMMIT; SELECT * FROM account;

事务的隔离级别

/*
当同事运行多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致并发问题 对于2个事务 T1 T2 脏读:T1读取了T2更新但还没提交的字段,若T2回滚,T1读取的内容就是临时无效的;
不可重复读:T1读取一个字段,然后T2更新了该字段后,T1再读同一字段,值发生了改变;
幻读:T1从表中读取了一些字段,T2插入了一些新行之后,如果T1再次读取,就会多出几行。 设置隔离级别:
read uncommited
read commited
repeatable read
serializable mysql支持:四种, 默认隔离级别:repeatable read
oracle支持:read commited,serializable,read only 默认隔离级别:read commited */

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

 

-- 显示隔离级别
SELECT @@tx_isolation -- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED -- 设置保存点 savepoing 只能搭配rollback
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id = 1;
SAVEPOINT a;
DELETE FROM account WHERE id = 2;
ROLLBACK TO a;

最新文章

  1. yuv rgb 像素格式1
  2. sql语句延时执行或者是指定时间执行
  3. C++ 虚拟继承
  4. [TimusACM][1258]程序员撞墙的问题
  5. ASP.NET MVC+Bootstrap个人博客之修复UEditor编辑时Bug(四)
  6. 如何在PowerDesigner将PDM导出生成WORD文档或者html文件
  7. winphone 开发学习笔记(2)
  8. Swift - 12 - 区间运算符和for-in
  9. 常用PHP正则表达式
  10. emmet(快速开发)的使用
  11. java 无法连接ftp服务器(500 OOPS: cannot change directory)
  12. 深入理解php内核 编写扩展 I:介绍PHP和Zend
  13. 20190412wdVBA 排版
  14. linux安装openssl
  15. python练习题_03
  16. 如何自定义一个组件loading
  17. C# 调整控件的Z顺序
  18. 你应该学会使用的5个ruby方法
  19. CTP API开发之一:CTP API简介
  20. [WINDOWS MOBILE | SOLUTION] 通过有线连接到 PC 后,WM设备能 PING 通网关但是不能上网

热门文章

  1. Struts数据验证
  2. Weex 和 React Native 的比较看这里
  3. Java 泛型 一
  4. 4. extjs中form中的frame:true表示什么
  5. DNS中的AC、rndc、智能DNS解析和基础排错
  6. loadrunner中get和post请求
  7. $CF1153A\ Serval\ and\ Bus$
  8. 二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
  9. UE编辑器编译和运行java设置
  10. 368 Largest Divisible Subset 最大整除子集