一、事务基本认识

1.事务的概述

     为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元。当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

     事务的操作: 先定义开始一个事务,然后对数据做修改操作,这时如果提交(commit),这些数据就永久的保存下来,如果回退(rollback),数据库管理系统就放弃所有的修改而回到开始事务的状态。

 

2.事务的属性

(1)原子性(Atmicity)

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

(2)一致性(Consistency)

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

(3)隔离性(Isolation)

    事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

(4)持久性(Durability)

     持久性是一个事务一旦被提交,它对数据库中的数据改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

 

二、事务在JDBC中的操作

     (1)如果多个操作,每个操作使用的是自己的单独连接,则无法保证事务。

     (2)使用步骤:

         A: 事务开始前,开始事务,即取消自动提交。con.setAutoCommit(false);

         B: 如果事务的操作都成功,就提交事务。con.commit();

         C: 如果出现异常,在Catch块中回滚事务。con.rollback();

	/*
* 事务
* 1.如果多个操作,每个操作使用的是自己的单独连接,则无法保证事务。
* 2.步骤
* (1)事务开始前,开始事务,即取消自动提交。
* con.setAutoCommit(false);
* (2)如果事务的操作都成功则提交事务
* con.commit();
* (3)回滚事务: 如出现异常,在catch块中回滚事务。
* con.rollback();
*/ @Test
public void testTx(){ Connection con = null; try{ //保证连接是唯一的,传入相同的Connnection
con = JdbcTools.getConnection(); //开始事务:取消默认提交
con.setAutoCommit(false); String sql = "update person set salary = salary - 500 where name = ?";
JdbcTools.update(con,sql,"Tom"); int i = 1 / 0; String sql2 = "update person set salary = salary + 500 where name = ?";
JdbcTools.update(con,sql2,"Jerry"); //正常就提交事务
con.commit(); }catch(Exception e){
e.printStackTrace(); //出现异常就回滚事务
try{
con.rollback();
}catch(SQLException e1){
e1.printStackTrace();
}
}
finally{
JdbcTools.releaseResource(con,null,null);
}
}

 

三、数据库的隔离级别

数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力,使它不会相互影响,避免各种并发问题。

隔离级别: 一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,一致性就越好,但并发性越弱。

     对于同时运行的多个事务,当这些事务访问数据库相同数据时,如果没有采用必要的隔离机制,就会导致各种并发问题。

脏读 对于两个事务T1,T2,T1读取了已经被T2修改但未提交的字段。
不可重复读      T1读取了一个字段,然后T2更新了该字段,之后T1再次读取同一个字段,值就不同了。
幻读     T1从一个表读了一个字段,T2在该表插入一些新行,T1再读,就多几行了。

     看到上面的,我感觉不可重复读和幻读貌似区别不大,但是上网搜了下,有人说了它俩的区别。

     不可重复读的重点是修改。同样的条件, 你读取过的数据, 再次读取出来发现值不一样了。

     幻读的重点在于新增或者删除。同样的条件, 第1次和第2次读出来的记录数不一样。

 

数据库提供了4种事务隔离级别

隔离级别

描述

Read UnCommited(读未提交)

允许事务读取其他事务未提交的修改。脏读、不可重复读、幻读都会出现。

Read Commited(读已提交)

只允许事务读取其他事务提交的数据。可避免脏读,不能避免不可重复读、幻读。

Repeatable Read(可重复读)

     确保事务可以从一个字段读相同的值,在这个事务持续期间,其他事务不能对这个字段进行更新。可避免脏读、不可重复读,不能避免幻读。

Serializable(串行化)

    确保事务可以从一个表读取相同行。在这个事务持续期间,禁止其他事务对该表执行插入、更新、删除。所有并发问题都可以避免,但是性能十分低下。

     Oracle 支持的 2 种事务隔离级别: READ COMMITED, SERIALIZABLE。Oracle 默认的事务隔离级别为: READ COMMITED 。Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ。

JDBC设置事务的隔离级别代码如下。

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

     每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别. MySQL 默认的隔离级别为 Repeatable Read。

查看当前的隔离级别: SELECT @@tx_isolation;

设置当前 mySQL 连接的隔离级别: set  transaction isolation level read committed;

设置数据库系统的全局的隔离级别: set global transaction isolation level read committed;

JDBC基础学习(四)—数据库事务的更多相关文章

  1. Jdbc执行存储过程报数据库事务无法执行的异常

    Jdbc执行存储过程报数据库事务无法执行的异常 环境: Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012 问题: 一个小 ...

  2. Python基础学习四

    Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...

  3. Java数据库连接--JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...

  4. mysql学习笔记--数据库事务

    一.概念 1. 事务是一个不可分割的单元 2. 事务作为一个整体要么一起执行,要么一起回滚 二.事务操作 1. 开启事务 start transaction 或者begin [work] 2. 提交事 ...

  5. spring学习笔记---数据库事务并发与锁详解

    多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分 ...

  6. 多事务运行并发问题spring学习笔记——数据库事务并发与锁详解

    多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分 ...

  7. 数据库程序接口——JDBC——功能第四篇——事务之Spring事务

    综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...

  8. Django基础学习四_数据库的增删改查

    今天主要学习两个东西 1.如何对数据库做增删改查 2.如果将数据库中的数据用html的方式返回到前台 一.对数据库中增删改查操作 1.首先需要先见表,见表的方法我们在“http://www.cnblo ...

  9. springmvc学习笔记三:整合JDBC,简单案例==数据库事务配置(切面)

    package cn.itcast.bean; import org.springframework.jdbc.core.PreparedStatementSetter; public class U ...

随机推荐

  1. P177 test 6-4 UVa439

    //P177 test 6-4 UVa439 #include<cstdio> #include<cstring> #include<queue> using na ...

  2. Javascript正则表达式(上)

    正则表达式一般用于验证客户端的用户输入,而服务器端的PHP.ASP.NET等脚本无须再进行验证,节约了后台开销. 1.两种创建方法 var box=new RegExp("Box" ...

  3. JavaScript两个变量交换值(不使用临时变量)

    概要  本文主要描述,如何不使用中间值,将两个变量的值进行交换. 一.普通做法 var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp;  普通的做法就是声明多一 ...

  4. SQL Server 2008R2 企业版 百度云下载地址

    SQL Server 2008R2 (百度云下载地址:链接: http://pan.baidu.com/s/1mi34II8 密码: yc1w)   ASP.NET MVC4.0+ WebAPI+Ea ...

  5. mfc---CFileFind

    使用CFileFind实现在指定路径下,查找指定类型文件 CFileFind.FindFile(FilePath + "\\*.*"),成功返回true,否则返回false CFi ...

  6. jquery 中时间的运用

    运用Moment插件比较方面,有兴趣可以仔细阅读 http://momentjs.cn/

  7. 每天一个Linux命令 8

    yum 光盘yum源搭建好处:不需要上网,省去许多网络yum源下载所需的时间,安装速度会大大增加.缺点:yum源不一定是最新的 1.打开虚拟机,加载光盘镜像,进入Linux系统,挂载光盘.2. 让网络 ...

  8. 2272: [Usaco2011 Feb]Cowlphabet 奶牛文字

    2272: [Usaco2011 Feb]Cowlphabet 奶牛文字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 138  Solved: 97 ...

  9. ST HW2 fault & error & failure

    Software Testing 3014218128 牛菲菲 Below are two faulty programs. Each includes a test case that result ...

  10. 关于极光推送在手机系统低于iOS10的手机上闪退的问题。

    最近项目中用到了极光推送,升级到了最新的SDK 2.1.9版本,发现只能在iOS10 上运行,其他测试的时候真机闪退.贴上一个可能的原因: