文档章节

JDBC之事务处理

Typing_Orange
 Typing_Orange
发布于 2017/05/08 21:10
字数 743
阅读 16
收藏 1

事务管理的概念

事物(Transaction)是作为单个逻辑工作单元执行的一系列操作。
 

这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。
 

事物的特点

  1. 原子性(Atomicity)
    事物是一个完整的操作。
    只有事务中所有的操作执行成功,才算整个事务成功,事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该回到执行事务前的状态。
     
  2. 一致性(Consistency):
    当事物完成时,数据必须处于一致状态。
    例如对于银行转账事务,不管事务成功还是失败,应该保证事务结束后两个转账账户的存款总额是与转账前一致的。
     
  3. 隔离性(Isolation)
    对数据进行修改的所有并发事物是彼此隔离的。
    指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
    例如:业务员A和业务员B,因为李四的转账请求,都需要对张三的银行账号余额进行操作。
    但在业务员A对张三的银行账号进行操作时,业务员B需要等待!(对数据库的操作需要保持一个事物的锁定)。业务员A操作完成后,业务员B才能进行操作。他们之间是彼此隔离的。
     
  4. 永久性(Durability):
    事物完成后,它对数据库的修改被永久保持。
    即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
     

JDBC对事物管理的支持
 

  1. 通过提交commit()或是回退/回滚rollback()来管理事物的操作

     
  2. 事物操作默认是自动提交的

     
  3. 可以通过调用setAutoCommit(false)来禁止自动提交

     

通过代码实现事务管理
 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TransactionDemo {

	/**
	 * 创建数据库连接
	 * 
	 * @return
	 */
	public Connection getConnection() {
		Connection conn = null;
		try {
			// 加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 连接数据库
			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydata2?useSSL=true", "root", "1121");

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	public static void main(String[] args) {
		TransactionDemo td = new TransactionDemo();
		Connection conn = td.getConnection();

		try {
			/**
			 * 事务处理的步骤: 一、关闭自动提交:conn.setAutoCommit(false);
			 */
			conn.setAutoCommit(false);

			PreparedStatement ptmt = conn.prepareStatement("update info set sex = ?  where id = ? ");
			ptmt.setInt(1, 1);
			ptmt.setInt(2, 1002);
			int count = ptmt.executeUpdate();
			
			/**
			 * 故意设置异常点,导致数据写入不完整。
			 * 如果没有进行事务处理,则会导致数据丢失或异常,
			 * 如果进行了事务处理,则会对执行的操作进行回滚(还原撤销读写操作)。
			 */
			// int i = 1/0;
			
			
			// 二、手动提交事务:conn.commit();
			conn.commit();
			System.out.println("成功更新数据:" + count);

		} catch (Exception e) {
			try {
				// 三、进行事务回滚:conn.rollback;//放置在try-catch语句中
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}
}

 

© 著作权归作者所有

下一篇: Java中的Object类
Typing_Orange
粉丝 15
博文 47
码字总数 30624
作品 0
南京
私信 提问
Minidao_1.6.1版本发布,超轻量Java持久化框架

Minidao_1.6.1版本发布了,超轻量Java持久化框架 升级日志 1,修复minidao参数不支持下划线问题 2,修复minidao接口定义返回类型为基本数据类型,无法传参数问题 3,拓展灵活性,通过sql判断...

Jeecg
2016/09/12
1K
5
Midao JDBC 0.9.4 发布,JDBC 工具包

Midao JDBC 0.9.4 是一个维护版本,包含大量的重构,废弃了一些类,以及一些类修改了名称。 Midao JDBC 简化了 JDBC 的开发,特点是灵活、可定制、简单直观,提供大量的功能,包括事务处理、...

oschina
2013/08/03
1K
4
Oracle和MySQL数据库的比较

本次使用Oracle11g和MySQL5.0作比较,目的是为了整理和巩固所学的数据库知识,也为了加深印象.(本人菜鸟,请大神们多多指教) 不同点 所占内存不同 Oracle11g在官网上下载的时候显示大约2g大小的...

青椒炒盖饭
2018/12/19
0
0
Midao JDBC 0.9.5 发布,JDBC 工具包

Midao JDBC 0.9.5 增加四个新的输入处理器允许直接通过参数进行配置,一个非常强大的处理器允许加载和执行查询,支持从外部 XML 文件读取并处理配置参数等. Midao JDBC 简化了 JDBC 的开发,...

oschina
2013/10/23
1K
7
Spring引用Tomcat的 JTA事务

Spring引用Tomcat的 JTA事务 Tomcat是Servlet容器,但它提供了JNDI的实现,因此用户可以象在Java EE应用程序服务器中一样,在Tomcat中使用JNDI查找JDBC数据源。在事务处理方面,Tomcat本身并...

崔耀升
2010/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
31分钟前
2
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
33分钟前
0
0
nginx-rtmp-module的缺陷分析(二)

nginx-rtmp-module使用指令push和pull来relay媒体流数据,以便分布式部署服务。 当nginx-rtmp-module作为边缘服务器(一般不会向边缘服务器推流)时,使用pull从源服务器获取媒体流数据,俗称...

YoungSagit
33分钟前
0
0
代理模式

保护代理和虚拟代理 虚拟代理 把开销大的操作等到需要执行创建的时候再去执行创建 var myImage = +function () { var imgNode = document.createElement('img'); docume......

莫西摩西
41分钟前
2
0
从国企到互联网,程序员六年四段工作经历,一份被很多 HR都 刷掉的简历!

程序员,六年,四段工作经历,这也许是一份会被很多 HR 刷掉的简历。 从学生时代至今,我经历了两次大的方向转型和一次大的技术转型: 从偏理论推导的数学科学到重工程实践的计算机学科,从「...

我最喜欢三大框架
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部