1. 什么叫做事务?
2.默认情况下每一条sql语句都是一个事务,然后自动提交事务 ps:如果想多条语句占一个事务,则可以手动设置SetAutoCommit为false
3.关键字 start transaction;rollback;commit
3.1 练习 创建account表(id,name,money),插入两条数据(a,b);start transaction;set a+100,set b-100;commit rollback
create table account(
id int primary key auto_increment,
name varchar(20),
money double //在MySQL中没有money类型
);
insert into account values(null,'a',1000),(null,'b',1000)
start transaction
update account set money = money -100 where name='a';
update account set money = money +100 where name='b';
commit;
4.jdbc中事务管理
5. 设置回滚点
6.事务的四大特性(ACID)
总结:这一节主要讲了事务的概念;jdbc中使用事务;事务的四大特性
二、隔离性
事务的四大特性,前三点数据库能很好的帮我实现,我们重点来谈下隔离性。
ps:如果用单线程来实现隔离性的话(也就是用lock的方式),会降低数据库的性能和效率
1.不考虑隔离性可能造成的问题 ps:我们只要考虑这三个方面的问题两个人同时修改,两个人同时读,一读一改,这三种情况都考虑到了那么所有的问题都考虑到了
1.1 两个人同时修改
用lock来解决两个人同时修改的线程安全问题
1.2 两个人同时读
两个人同时读不存在线程安全问题
1.3 一读一改 ps:一读一改会出现三个问题:脏读、不可重复读、虚读
1.3.1 脏读
脏读就是读到了其他事务没有提交的数据 ps:比如a(淘宝买家)、b(淘宝卖家),a开启事务向b打了100块钱但是事务还未提交然后告诉b说我已经向你支付了100请你发货,这个时候b去账户查了一下果然多了100块于是给a发了货,但是这个时候a做了rollback操作,结果b亏了100钱的货(事务举例常用银行转账跟购物)
b卖家进行的操作:
select @@tx_isolation;
set transaction isolation level read uncommitted;
start transaction;
//b一直在等待a付款,当a付款后告诉b发货时b去查了一下自己的账号
select * from account where name='b';
//这个时候b发现自己的账户中确实多了100快,当时万万没有想到此时a做了rollback的操作 a买家进行的操作:
start transaction;
update account set money = money - where name='a';
update account set money = money + where name ='b';
//这个时候a告诉卖家b说我已经给你打款了,你赶快给我发货吧
//当b发货之后a做了rollback的操作
rollback;
1.3.2 不可重复读
在同一个事务中多次读取的结果不一样,原因就是有人修改了数据 ps:举例,银行工作人员报表统计
b卖家进行的操作:(b开始的)
select @@tx_isolation;
set transaction isolation level read uncommitted;
//一开始b就在等待其他买家付款,所以一开始就开启了一个事务查询了自己的账户
start transaction;
select * from account where name='b';
//这个时候查到的钱是1100,之后一直在等待买家a付款
……
//卖家b在接到买家a的付款通知之后查询了下自己的账户
select * from account where name='b';
//这个时候得到的金额数为1200了这个时候就出现了同一个事务类查询的结果不一样了,也就是不可重复读(在有些情况下这种不可重复是正确的)
a买家进行的操作:
//买家a向卖家b付了一百块钱
start transaction;
update account set money = money - where name='a';
update account set money = money + where name ='b';
commit;
//买家a提交事务之后就通知卖家b
1.3.3 虚读(幻读)
一个事务读取了别的事务插入的 数据,导致前后读取不一致(读到不存在的数据,所以叫虚读)
b银行业务员进行的操作:(b开始的)
select @@tx_isolation;
set transaction isolation level read uncommitted;
//一开始b就开启一个事务,统计开户总数
start transaction;
select count(*) from account;
//这个时候查到的个数是2,正在这个时候用户a在银行开一新户
……
select count(*) from account;
////这个时候查到的个数是3,这个时候就出现了幻读虚读,读取了其他事务新插入的数据 a用户进行的操作:
//用户a开户
start transaction;
insert into account values(null,'c',);
commit;
//用户a开了户之后,业务员b又做了一次统计
2.数据库的四大隔离级别(read uncommitted、read committed、repeateable read、serializable)
2.1 read uncommitted 不防止任何隔离性的问题(脏读、不可重复读、虚读的问题都存在)
2.2 read committed 能防止脏读,但是不能防止不可以重复读和虚读
2.3 repeatable read 能脏读、不可重复读,但是不能防止虚读
2.4 serializable 能防脏读、不可重复读、虚读,但是效率是最低的
2.5 补充
2.5.1 查询数据库的隔离级别 select @@tx_isolation
2.5.2 设置数据库的隔离级别 set [global/session] transaction isolaiton level XXX 不加global和session的话指修改客户端的隔离级别
2.5.3 个人对隔离性的理解 PS:其实就是利用锁机制控制我在进行事务的时候你能做什么操作(读、写、修改、插入crud)
开启一个事务就好像复制了一份数据,该事务设置的隔离级别就是该数据被其他事务影响的程度。read uncommitted 则其他事务为提交的事务也能影响到改数据,read committed 则是提交后的数据能影响到,repeatable read 则未提交和已经提交的修改数据都不能影响到该数据但是新插入的数据可以影响到,serializable则该数据不受任何的影响
三、数据库中的锁机制
1.共享锁:在非serializable隔离i级别下做查询不加任何锁,而在serializable隔离级别下做查询加共享锁
1.1 共享锁的特点:共享锁可以与共享锁共存,共享锁不能排他锁共存
2. 排他锁:在所有隔离级别下做修改都会加排他锁
2.1 排他锁和其他任何锁都不能共存
3.补充
3.1 sql语句的执行顺序
from where select group by having order by
3.2 用sql语句选出每个科目成绩最好的
select max(socre) from t_score group by subject ps:按照sql语句的执行顺序先from表在内存中有一段数据块然后根据subject分组,摞成一小堆(在数据库查询的时候我们只能看到最上面那个),然后我们再在一摞摞的小组中选出分数最大的
3.3 选出各个科目成绩前两名的学生 问题拆分:先选出一门具体学科成绩的前两名;各个学科相当于条件扩大到了所有学科如select top 2 from score where subject in(select subject from score )
四、更新丢失问题
1.问题描述:不同的用户,基于相同的查询结果,更新时(多个线程)出现覆盖的问题
传智播客JavaWeb day11--事务的概念、事务的ACID、数据库锁机制、的更多相关文章
-
传智播客JavaWeb day01 快捷键、XML
2015-01-14 一直计划着学习java,今天晚上终于下定决心看了下传智播客朴乾老师的javaweb开发视频day01之第一讲,主要内容是开发工具简单介绍.怎么创建工程.Junit的介绍,我是C# ...
-
传智播客JavaWeb听课总结
一. JavaWeb基础 第一天: 1.Eclipse详解: (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合.高的JRE版本兼容低版本的 ...
-
传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销
第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...
-
传智播客JavaWeb day02笔记
2015年1月21日 今天的主要内容:介绍了几款常用Javaweb服务器,重点介绍了tomcat以及tomcat的安装和怎么样检测安装成功 1.JavaWeb常见服务器 Tomcat(免费但是只支持部 ...
-
传智播客JavaWeb day09-mysql入门、数据库操作、数据库表操作、数据行操作
不知不觉已到了第九天了,今天主要讲了关系数据库的基本概述.安装.数据库.表和数据行的操作 1. 基本概述 1.1 数据库就是用来存储数据的.早期是存在文件里面的操作起来效率低而且不是很安全. 1.2 ...
-
传智播客JavaWeb day05-session、url重写
1.session是什么 1.1 session是一种会话技术 ps:还有一种是cookie 2.session的作用 2.1 服务器端会话范围内的数据共享 3.session的生命周期 3.1何时 ...
-
传智播客JavaWeb day10-jdbc操作mysql、连接数据库六大步骤
第十天主要讲了jdbc操作mysql数据库,包括连接数据库六大步骤(注册数据库驱动.获得连接对象connetion.生成传输器stament.执行查询获得ResultSet.遍历结果集.关闭资源).介 ...
-
传智播客JavaWeb day06-jstl
一.jsp标签(sun公司提供的) 二.EL表达式 三.jstl (javaserver pages standard tag library) 1.为什么要有jstl jsp标签太弱,el表达式功能 ...
-
传智播客JavaWeb day03
ServletContext 这堂课主要讲ServletContext这个web域(可以看得见范围的)对象,web在启动的时候会创建唯一的ServletContext域对象. 作用:1.用来web域共 ...
随机推荐
-
【iCore3双核心板】发布 iCore3 硬件手册!
百度网盘下载: https://pan.baidu.com/s/1jHZJCbW 博客园下载: http://files.cnblogs.com/files/xiaomagee/iCore3%E7%A ...
-
一起刷LeetCode4-Median of Two Sorted Arrays
实验室太吵了...怎么办啊... ----------------------------------------------------------------------------------- ...
-
UVA1374 IDA*
我刚开始的思路就是:用启发函数max * pow(2 , maxd - d) < n直接去判断,两个for循环往数组延伸,找到n为止,可是速度太慢.刘汝佳大哥说的直接使用新延伸出来的数,这样确实 ...
-
npm安装依赖包 --save-dev 和 --save; package.json的devDependencies和dependencies 的区别!
以前一直在纠结一个npm安装的包依赖管理的问题.是这样的: 我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,他们是:--save- ...
-
[leetcode]Regular Expression Matching @ Python
原题地址:https://oj.leetcode.com/problems/regular-expression-matching/ 题意: Implement regular expression ...
-
UVa 11440 - Help Tomisu(欧拉函数 + 问题转换)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
-
EasyUi模糊匹配搜索框combobox
现在项目当中很多已经应用了Jquery-easyUi这个界面框架了,所以,学习一点easyUI的常用工具就显得很重要了,现在介绍的就是我在项目中用到的easyUi的模糊匹配组合框combobox. c ...
-
手动整合实现SSH项目开发02
在bean包下建立User类和User.hbm.xml文件,实现User类和数据库表User的映射关系,具体User类不多说,User.hbm.xml如下: <?xml version=&quo ...
-
如何使用JSON格式 POST数据到服务器
1. JSON的数据格式a) 按照最简单的形式,可以用下面这样的 JSON 表示名称/值对: { "firstName": "Brett" } b) 可以创建包 ...
-
C++实现对数学基本运算表达式的解析
代码地址如下:http://www.demodashi.com/demo/11078.html 前段时间在LeetCode上刷题,遇到了很多涉及对字符串进行解析的题目.可能是出于这个原因,最近迷恋上了 ...