事务_2

演示不同隔离级别下的并发问题

1.当把事务的隔离级别设置为read uncommitted时,会引发脏读、不可重复读和虚读

A窗口
set transaction isolation level read uncommitted;
start transaction;
select * from account;
-----发现a帐户是1000元,转到b窗口
select * from account
-----发现a多了100元,这时候a读到了b未提交的数据(脏读)

B窗口
start transaction;
update account set money=money+100 where name=‘aaa‘;
-----不要提交,转到a窗口查询

2.当把事务的隔离级别设置为read committed时,会引发不可重复读和虚读,但避免了脏读

A窗口
set transaction isolation level read committed;
start transaction;
select * from account;
-----发现a帐户是1000元,转到b窗口
select * from account;
-----发现a帐户多了100,这时候,a读到了别的事务提交的数据,两次读取a帐户读到的是不同的结果(不可重复读)

B窗口
start transaction;
update account set money=money+100 where name=‘aaa‘;
commit;
-----转到a窗口

3.当把事务的隔离级别设置为repeatable read(mysql默认级别)时,会引发虚读,但避免了脏读、不可重复读

A窗口
set transaction isolation level repeatable read;
start transaction;
select * from account;
----发现表有4个记录,转到b窗口
select * from account;
----可能发现表有5条记如,这时候发生了a读取到另外一个事务插入的数据(虚读)

B窗口
start transaction;
insert into account(name,money) values(‘ggg‘,1000);
commit;
-----转到 a窗口

4.当把事务的隔离级别设置为Serializable时,会避免所有问题
A窗口
set transaction isolation level Serializable;
start transaction;
select * from account;
-----转到b窗口

B窗口
start transaction;
insert into account(name,money) values(‘ggg‘,1000);
-----发现不能插入,只能等待a结束事务才能插入

加入dbcp链接池
1.导入jar包
commons-dbcp-1.2.2.jar commons-pool.jar

2、在类目录下加入dbcp的配置文件:dbcpconfig.properties

3、在jdbcUtils的静态代码块中创建池
private static DataSource ds = null;
static{
try{
InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties prop = new Properties();
prop.load(in);

BasicDataSourceFactory factory = new BasicDataSourceFactory();

ds = factory.createDataSource(prop);
System.out.println(ds);
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}

时间: 2024-11-17 13:50:58

事务_2的相关文章

阶段3 1.Mybatis_07.Mybatis的连接池及事务_2 连接池介绍

原文地址:https://www.cnblogs.com/wangjunwei/p/11317664.html

Mysql --09 Innodb核心特性——事务

目录 Innodb核心特性--事务 1.什么是事务 2.事务的通俗理解 3.事务ACID特性 4.事务流程举例 5.事务的控制语句 6.事务隐式提交情况 7.事务日志redo基本功能 8.redo数据实例恢复过程 9.事务日志undo 10.redo和undo的存储位置 11.事务中的锁 12.多版本并发控制(MVCC) 13.锁的粒度 14.事务的隔离级别 15.脏读 幻读 重复读 查询原因,和解决办法 (RR级别) Innodb核心特性--事务 1.什么是事务 主要针对DML语句(updat

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

MySQL的事务与事务隔离

MySQL中自从引入InnoDB引擎后,在MySQL中就支持事务,事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元,平时通过提交工作单元来完成在事务中的相应的查询或修改,在能支持事务的数据库中必须要满足ACID测试,即事务的四个特性: A:Atomicity,原子性(都执行或者都不执行) C:Consistency,一致性(从一个一致性状态转到另外一个一致性状态) I:Isolaction,隔离性(一个事务的所有修改操作在提交前对其他事务时不可见的) D: Durability

(十五)PL/SQL事务

数据库事务是一个工作的原子单元,其可以由一个或多个相关的SQL语句组成.所谓的原子性就是数据库的修改所带来的构成事务的SQL语句可以集体被提交,即永久到数据库或从数据库中(撤消)回滚.一个成功执行的SQL语句和提交的事务不一样.即使一个SQL语句执行成功,除非包含该语句的事务被提交,但也可以回滚和声明(S)的所有更改可以撤消. 一.开始事务事务都有开始和结束.事务开始时有下列事件之一:  连接到数据库后执行的第一个SQL语句.  在事务完成之后发出每一个新的SQL语句完成. 二.提交事务事务是通

spring事务没回滚

最近遇见一个问题,用spring管理实务,在service层处理数据,保存数据时出现异常,但没有回滚,检查了一下,发现是因为我用try catch将异常进行捕获了,没有抛出导致的:默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚. 处理发法一:捕获异常后,新生成runtimeexcetpion: try { userDao.save(user); userDao.update(user); } catch (Exception e) { logger.info("

回滚的意义---JDBC事务回滚探究

JDBC手动事务提交回滚的常见写法一直是rollback写在commit的catch之后: try{ conn.setAutoCommit(false); ps.executeUpdate(); ps.executeUpdate(); conn.commit(); }catch(Exception e){ conn.rollback(); } 但是,这种回滚是没有意义的: 一旦commit前出错, 就不提交了, 回滚无用 一旦commit了, 说明没错, 不用回滚 找到一篇和我观点相同的文章:

我的学习之路_第二十二章_事务

JDBC事务 [事务] 作用: 保证多条SQL语句,要么都执行成功,要么都执行失败. mysql数据库,执行SQL语句,自动开启事务,提交事务,回滚事务,把数据永久保存 oracle数据库,执行SQL语句,手动开始会务,提交事务,回滚事务,把数据永久保存. Connection接口中和事务有关的方法: 无返回值 setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态. 参数:autoCommit : true表示自动提交模式, false表示禁用

SQL事务的四种隔离级别

1未提交读(Read uncommitted):完成不锁表,所以会出现脏数据.2提交读(Read committed):1.事务1中update才锁表,可以select到最新数据. 事务2select查不到数据. 会一直等.加上WITH (NOLOCK)就可以读了. 2.select是不锁表,所以其他事务可以修改数据.当有两个select时, 第二个select会出现脏数据.不可重复读. 3可重复读(Repeatable read): 解决提交读不可重复读的问题的,两次查询到的结果一致. 这只能