Java事务(一) - 概述

一. 什么是事务:

所谓事务,就是针对数据库的一组操作(多条sql)

位于同一个事务的操作具备同步的特点,也就是要么都成功,要么都失败

二. 事务的作用:

在实际中,我们的很多操作都是需要由多条sql来共同完成的,例如,A账户给B账户转账就会对应两条sql

update account set money = money - 100 where name = ‘a’;

update account set money = money + 100 where name = ‘b’;

假设第一条sql成功了,而第二条sql失败了,这样就会导致a账户损失了100元,而b账户并未得到100元

如果将两条sql放在一个sql中,当第二条语句失败时,第一条sql语句也同样不会生效,

这样a账户就不会有任何的损失

三. 事务的实现原理:

默认情况下,我们向数据库发送的sql语句是会被自动提交的,开启事务就是相当于关闭自动提交功能,改为手动提交,我们只需要将提交事务的操作放在最后一个操作,这样一来,如果在提交事务之前出现异常,由于没有执行提交操作,事务中未提交的操作就会被回滚掉

四. 在程序中使用 jdbc 开启事务

在使用 jdbc 操作数据库时,需要使用 Connection 对象对事务进行管理

// 开启事务

Connection.setAutoCommit(false); //设置自动提交为false

// 回滚事务

Connection.rollback();

//提交事务

Connection.commit();

在 jdbc 程序中我们还可以设置回滚点,让事务回滚到指定的回滚点,而不是自动回滚所有未提交的操作

需要将程序中的异常捕获,在catch语句块中回滚事务,在finally中提交事务

注意 ,将 Commit 操作放在 finally 中是为了保证提交未回滚的事务操作

五. 事务的特性

事务有四大特性,一般来讲,判断一个数据库是否支持事务,就看数据库是否支持这四个特性

1. 原子性(Atomicity)

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

2. 一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

3. 隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

4. 持久性(Durability)

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

六. 事务的隔离级别

1)多线程开启事务

由于数据库是多线程并发访问的,所以很容易出现多个线程同时开启事务的情况

多线程开事务容易引起 赃读、不可重复读、幻读 的情况发生

##  赃读:dirty read  ##

是指一个事务读取了另一个事务未提交的数据,这是相当危险的。

设想一下,A要给B转账100元购买商品, 如果A开启了一个事务做了转账的工作

update account set money = money + 100 while name = ‘b’;

update account set money = money - 100 while name = ‘a’;

A先不提交事务,通知B来查询

这时B来查询账户,由于会读到A开启的事务中未提交的数据,就会发现A确实给自己转了100元,

自然就会给A发货,A等B发货后就将事务回滚,不提交,此时,B就会受到损失

##  不可重复读:non-repeatable read  ##

是指事务中两次查询的结果不一致,原因是在查询的过程中其他事务做了更新的操作 update

例如,银行做报表,第一次查询A账户有100元,第二次查询A账户有200元,原因是期间A存了100元

这样就会导致一行多次统计的报表不一致

和脏读的区别是:

脏读是读取前一事务未提交的脏数据,不可重复读是在事务内重复读取了别的线程已提交的数据。

有的时候大家会认为这样的结果是正确的,没问题

我们可以考虑这样一种情况,比如银行程序需要将查询结果分别输出到电脑屏幕和写到文件中,结果在一个事务中针对输出的目的地,进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作人员就不知道以哪个为准了。

##  幻读:phantom read  又名虚读  ##

是指在一个事务内两次查询中数据笔数不一致

幻读和不可重复读有些类似,是指两次查询过程中,其他事务做了插入记录的操作,导致记录数有所增加insert

例如银行做报表统计account表中所有用户的总额时,此时总共五个账户,总金额为500元,这时有一个新的账户产生了,并且

存了100元,这时银行再统计会发现帐户总金额为600元了,造成虚读同样会使银行遇到同样的困惑

2)设置事务的隔离级别

为了避免多线程开事务引发的问题,我们需要将事务进行隔离

事务有四种隔离级别,不同的隔离级别可以防止不同的错误发生

serializable:可串行化,能避免脏读、不可重复读、幻读情况的发生

repeatable read:可重读,能避免脏读、不可重复读情况的发生

read committed:读取提交的内容,可避免脏读情况发生

read uncommitted:读取未提交的内容最低级别,避免不了任何情况

不同的需求就会采取不同的隔离级别, 而且不同的隔离级别他的性能也不一样

操作:

设置事务隔离级别

set   transaction isolation level

查询当前事务隔离级别

select @@tx_isolation

查询看到的都是快照<其实就是设置事务前的一个拷贝,>

位于事务中的多次查询,如果隔离级别设置为repeatable read,那么多次查询读的就是一个快照, 说白了就是不更新快照

时间: 2024-08-05 18:40:26

Java事务(一) - 概述的相关文章

Java事务与JTA

一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么全部执行成功,要么撤销不执行. 事务必须服从ISO/IEC所制定的ACID原则. 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效. 一致性表示当事务执行失败

java之集合概述

集合也称容器:从大的类别分成两类:Collection和Map,也即:单列和双列列表. java编程思想中一张图说明该体系的整体结构:其中黑色着重的类是经常使用的类. 1 Collection Collection:作为单列集合的根接口.该类集合的继承体系如下: Collection分为两大类:List和Set 1)List: 特点:有序的 collection(也称为序列):列表通常允许重复的元素.       List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Ite

温故而知新java事务

一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (isolation)和持久性(durability)的缩写. 原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效. 一致性:表示 当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态. 隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见. 持 久性:表

java事务(三)——自己实现分布式事务

在上一篇<java事务(二)——本地事务>中已经提到了事务的类型,并对本地事务做了说明.而分布式事务是跨越多个数据源来对数据来进行访问和更新,在JAVA中是使用JTA(Java Transaction API)来实现分布式的事务管理的.但是在本篇中并不会说明如何使用JTA,而是在不依赖其他框架以及jar包的情况下自己来实现分布式事务,作为对分布式事务的一个理解. 假设现在有两个数据库,可以是在一台机器上也可以是在不同机器上,现在要向其中一个数据库更新用户账户信息,另外一个数据库新增用户的消费信

java事务的类型——面试被问到

Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 1.JDBC事务 JDBC 事务是用 Connection 对象控制的.JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交. java.sql.Connection 提供了以下控制事务的方法: public void setAutoCommit(boolean)public boolean getAutoCommit()

Java语法学习概述

Java语法学习概述: 1,数值型有:    整数类型分     byte:127到-128 8位(1个字节);只用后七位表示数字 第一位表            示正负号;特点最基本数据单元,占空间少 short:16位(2个字节)短整型 -32768到32767 int:32位(4个字节) 整型 正负21亿 写程序大部分用int写 long:64位(8个字节) 长整型 +-922后面16个零多           数字后面加字母L 或小写l 表示long型数据           用数字表示

java事务管理 (转)

什么是事务: 首先,说说什么事务.我认为事务,就是一组操作数据库的动作集合. 事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操 作一样被完整地执行,我们称该事务被提交.由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (isolation)和持久性

什么是Java事务

一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isolation)和持久性(durability)的缩写.事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效.一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态.隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见.持久性表示已提交的数据在

java事务管理

什么是事务: 事务,就是一组操作数据库的动作集合. 一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交.由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态. 事务必须满足ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isolation)和持久性(durability)的缩写. 事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任