文档章节

关于事务

锦爷要逆天
 锦爷要逆天
发布于 2017/01/26 11:34
字数 1325
阅读 49
收藏 0

1.1事务概述

事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。

事务作用:保证在一个事务中多次操作要么全都成功,要么全都失败。

1.1.1 mysql事务操作

sql语句

描述

start transaction;

开启事务

commit;

提交事务

rollback;

回滚事务

mysql中可以有两种方式进行事务的管理:

(1)自动提交:mysql默认自动提交(执行一条sql语句提交一次事务)

(2)手动提交:先开启再提交

如何打开手动事务:

关闭自动事务(针对于当前会话有效)

show variables like '%autocom%'

set autocommit=off

自动事物的危害?

开启一个手动事物(已经关闭自动事务)

update zhanghu set money=money-520 where name='jack';

断电了

update zhanghu set money=money+520 where name='rose';

commit/rollback

转账业务(2条)

开启一个手动事物(关闭自动事务)

update zhanghu set money=money-520 where name='jack';

update zhanghu set money=money+520 where name='rose';

.....

commit/rollback;

注意:事务最少要以2条以上的sql语句开始

在mysql中如何保证多条SQL语句在同一个事物中:

开启一个手动事务(关闭自动事物)

start transaction;开启一个手动事务

commit; 提交事务

rollback;事务回滚

扩展:oracle中的事务是手动事务.意味着每一条sql语句都需要手动提交

1.1.2 JDBC事务操作

Connection对象的方法名

描述

conn.setAutoCommit(false)

开启事务

conn.commit()

提交事务

conn.rollback()

回滚事务

1.1.3 DBUtils事务操作

Connection对象的方法名

描述

conn.setAutoCommit(false)

开启事务

New QueryRunner()

创建核心类,不设置数据源(手动管理连接)

Query(conn, sql, hander, params)或update(conn, sql, params)

手动传递连接

DbUtils.commitAndClose(conn)或DbUtils.rollbackAndClose(conn)

提交并关闭连接(回滚并关闭连接)

 

1.2事务管理

注意:要想保证所有的操作都在一个事务中,需要保证使用同一个连接即可(在service层使用的连接和在dao层使用的连接是同一个)。

方式一:传递Connection(将connection做为参数传递给dao)

修改service和dao,service将Connection传递给dao,dao不需要自己获得连接。

方式二:ThreadLocal(将连接和线程绑定起来)

把Coonection放在Threadlocal里面,在每一层里面根据Threadlocal的key(当前线程)获取value(Connection)。

ThreadLocal是JDK提供的工具类,可以在一个线程中共享数据。

java.lang.ThreadLocal提供了线程局部(thread-local)变量,用于在当前线程中共享数据。ThreadLocal工具类底层就是一个Map,key存放的是当前线程,value存放需要共享的数据。

构造方法:

new ThreadLocal();

常用方法:

set(Object value);  //相当于将内容和当前线程绑定

Object get();  //获取和当前线程绑定的内容

remove();  //移除和当前线程绑定的内容

 

1.3事务总结

1.3.1事务特性(ACID)

原子性(Atomicity)是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency)是事务前后数据的完整性必须保持一致。

隔离性(Isolation)是指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰。多个并发事务之间数据要相互隔离。

持久性(Durability)是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。

1.3.2并发访问问题

如果不考虑隔离性,事务中存在三种并发访问问题。

注意:在开发中绝对不允许脏读的发生

(1)脏读:一个事务读到了另一个事务未提交的数据

(2)不可重复读:一个事务读到了另一个事务已经提交(update)的数据;引发另一个事务,在事务中的多次查询结果不一致。

(3)虚读/幻读:一个事务读到了另一个事务已经提交(insert)的数据;导致另一个事务,在事务中多次查询的结果不一致。

1.3.3隔离级别:解决问题

可以通过设置数据库的隔离级别解决以上问题

read uncommitted(读未提交) 以上三个问题都会发生

read committed(读已提交) 避免脏读的发生 ---Oracle默认

repeatable read(可重复读) 避免脏读和不可重复读 ---MySQL默认

serializable(串行化) 避免所有问题的发生(效率低)

1.3.4安全和性能对比

安全性:串行化>可重复读>读已提交>读未提交

性能(效率):串行化<可重复读<读已提交<读未提交

 

1.4演示(了解)

演示脏读:

设置隔离级别

set session transaction isolation level read uncommitted;

查询当前隔离级别

select @@tx_isolation;

避免脏读发生,需要将隔离级别设置成-->读已提交

set session transaction isolation level read committed;

避免不可重复读发生,需要将隔离级别设置成-->可重复读

set session transaction isolation level repeatable read;

演示串行化:

相当于锁表操作,当前只有一个事务执行

set session transaction isolation level serializable;

 

 

 

 

© 著作权归作者所有

上一篇: Ajax&jQueryAjax
下一篇: EL&JSTL
锦爷要逆天
粉丝 0
博文 22
码字总数 61553
作品 0
昌平
程序员
私信 提问
Spring事务的传播行为中REQUIRES_NEW真的有效吗

上网稍微找了点关于Spring事务传播行为资料,基本都有这个表格: 事务传播行为类型 说明 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中...

Stephen_Qu
04/03
181
4
Java中的事务——JDBC事务和JTA事务

我的博客中曾经关于事务有过很多讨论,之前的事务介绍基本都是数据库层面的事务,本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解。 关于事务的基础知...

小神神的大草原
2016/10/20
33
0
Mysql Innodb中undo-log和MVCC多版本一致性读 的实现

http://blog.sina.com.cn/s/blog_4673e603010111ty.html 本文主要介绍mysql中innodb引擎undo-log和事务中MVCC多版本一致性读的实现。 概述 Innodb引擎的undo日志是记录在表空间中单独的回滚段...

石日天
06/26
28
0
Java事务设计策略

  如果您了解了Java中事务管理是如何工作的,并开发了有效的事务设计策略,这能帮助您避免应用与数据库中的数据完整性问题, 并减轻在难以避免的系统失败时遭受的痛楚。   本书是关于如何...

墙头草
2012/03/23
6
0
.NET简谈自定义事务资源管理器

在上一篇文章“NET简谈事务、分布式事务处理”中我大概总结了关于.NET中的事务处理方式和结合了WCF框架的简单应用。在事务性操作中我们的重点是能将数据进行可逆化,说白了就是能保证数据的A...

王清培
2012/01/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
今天
5
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部