使用事务

原创 2012年03月23日 09:56:20

下面介绍如何把一系列语句组织成一个事务?如果事务中所有命令都能正确执行,就可以提交这个事务;否则,如果事务中有一个命令出现错误,回滚这个事务,并返回到提交之前的状态,好像什么也没有发生。把命令组合成事务的主要原因是保证数据库的完整性。对于一个事务而言,要么事务中语句全部得到正确执行,事务就可被提交了,要么它中间出现错误。后一种情况,可以调用rollback()方法,数据库将自动放弃上一次提交事务以来的全部变化。一个数据库连接的缺省模式是autocommit模式,每个SQL命令一执行就会提交给数据库。一旦某个命令已提交,就不能把它回退。可以用Connection接口的getAutocommit()方法,检验数据库的目前自动提交模式设置。用命令con.setAutoCommit(false)方法关闭自动提交模式。用con.commit()命令提交事务。用con.rollback()回滚一个事务。

代码

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.naming.NamingException;

public class UseTran {
	public static void main(String[] args) {
		Connection con = null;// 方法里临时变量要手动初始化
		PreparedStatement updateAge = null;
		String updateString = "update student "
				+ "set age = ? where name like ?";
		String jndiname = "jdbcPool/mydatasource";
		try {
			con = DBCon.getConnectionFromPooledDataSource(jndiname);
			updateAge = con.prepareStatement(updateString);
			int[] age = { 45, 39, 25, 96 };
			String[] names = { "梁朝伟%", "贝壳汗母%", "小罗%", "霍元甲%" };
			int len = age.length;

			// 设置事务提交模式为非自动提交
			con.setAutoCommit(false);

			for (int i = 0; i < len; i++) {
				updateAge.setInt(1, age[i]);
				updateAge.setString(2, names[i]);
				updateAge.executeUpdate();
			}
			// 上面执行的语句,如果不出现异常则提交 SQL 语句
			con.commit();
			System.out.println("update success!");

		} catch (NamingException ex) {
			System.err.println("Name Not Bound : " + ex.getMessage());
		} catch (SQLException ex) {
			System.err.println("SQLException: " + ex.getMessage());
			if (con != null) {
				try {
					System.err.print("Transaction is being ");
					System.err.println("rolled back");
					// 如果出现异常则事务回滚
					con.rollback();
				} catch (SQLException excep) {
					System.err.print("SQLException: ");
					System.err.println(excep.getMessage());
				}
			}
		} finally {// 不管发生不发生异常,要关闭连接,释放资源
			try {
				if (con != null) {					
					con.close();
				}

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}


Mysql事务使用总结

Mysql事务主要用来处理数据量大、数据复杂度高的数据操作,最经典的使用场景是银行的转账:需要先从银行账户A中取出钱,然后再存入银行账户B中,如果中间出现问题,而没有事务的保证,那么就会出现B收不到钱...
  • why_2012_gogo
  • why_2012_gogo
  • 2016年03月22日 11:46
  • 3829

如何使用事务控制程序执行

事务是数据库中单个逻辑工作单元执行的一系列操作,这一系列操作要么完全的执行,要么完全不执行,它是一个不可分割的工作单位。...
  • u010942465
  • u010942465
  • 2014年11月25日 20:24
  • 1474

Spring事务总结---事务概述及Spring事务的基本使用(完整)

摘要: 在工作中时常需要用到Spring的事务,每次遇到问题都google十分浪费时间,不妨自己总结一下做个记录,希望以后遇到问题的时候能在自己的记录中找到答案。:) 一、事务概述    这...
  • AlbertFly
  • AlbertFly
  • 2016年09月27日 14:55
  • 696

事务,什么是事务,为何用事务?

事务,就是把一堆事情绑在一起做,都成功了才算完成,否则就恢复之前的样子 举例:银行ATM取钱,扣款成功后突然大停电,吐钱的操作还没做,这时候就要恢复没取钱时候的状态,否则钱扣了还没拿到手,多冤枉...
  • x289231673
  • x289231673
  • 2017年11月10日 15:04
  • 77

什么时候使用mysql事务

突然想到一个问题,mysql中我们经常用到事务,比如一次向几张表插入内容,如果中间出错了可以回滚,但是实际开发中,像这种一次可能向多个数据表写入数据的情况,并没有采用事务。   比如一件商...
  • lmy_1
  • lmy_1
  • 2017年01月12日 20:41
  • 1097

Spring整合Hibernate管理事务(xml配置方式)

之前是刚开始使用Spring的事务管理,采用比较简单方便的注解方式进行事务处理,而注解方式进行事务处理需要在每一个要实现事务的类上添加@Transactional注解,在比较小的项目中可以这样来用。但...
  • Julyraining
  • Julyraining
  • 2015年12月09日 16:30
  • 344

什么时候需要使用事务管理机制? (面试题)

对数据库的数据进行批量或连表操作时,为了保证数据的一致性和正确性,我们需要添加事务管理机制进行管理。当对数据库的数据进行操作失败时,事务管理可以很好保证所有的数据回滚到原来的数据,如果操作成功,则保证...
  • A1820358963
  • A1820358963
  • 2017年02月22日 10:26
  • 1442

Spring使用Quartz配置调度事务

首先编写服务类: package QuartzTest;import java.util.Date;public class CourseService ...{   public void star...
  • daryl715
  • daryl715
  • 2007年06月07日 21:27
  • 4176

MySQL数据库事务基本操作

这篇日志是自己学习了MySQL数据库的事务之后,总结的一点心得体会。都是一些非常基础的知识点。如能帮助诸位初学者,那真是我的荣幸。 数据库的事务,很多的博客也都有了详细的介绍。最基本的事务特性啊(AC...
  • fengpojian
  • fengpojian
  • 2017年06月22日 13:33
  • 1251

C#回顾学习笔记四十一:在三层架构中使用事务

三层架构中处理事务 1)为什么要特别强调如何在三层架构中处理事务? 在讲解这个之前,先要熟悉三层架构是什么(UI层、BLL层、DAL层)。如果还不了解三层架构的话,可以先阅读前一篇文章:http://...
  • privateHiroki
  • privateHiroki
  • 2017年09月28日 17:04
  • 607
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用事务
举报原因:
原因补充:

(最多只允许输入30个字)