专栏首页c#开发者JDBC的数据库事务

JDBC的数据库事务

   事务是工作中的基本逻辑单位。数据库的主要责任是保存信息,因此它需要向用户提供保存当前程序状态的方法。同样,当事务执行过程中发生错误时,需要有一种方法使数据库忽略当前的状态,并回到前面保存的程序状态。这两种情况在数据库用语中分别称为提交事务和回滚事务。为了处理这两种情况,JDBC API     包括了两个方法commit()和rollback(),分别用于实现事务的提交和回滚。在使用这两个方法时通常要使用try ... catch语句捕获数据库实际运行操作时可能发生的SQLException。

当多个用户访问相同的数据时,可能会出现3种问题:

  • 脏读 如果一个应用程序使用了被另一个应用程序修改过的数据,而这个数据处于未提交状态,这时就会发生脏读。第二个应用程序随后会请求回滚被其修改的数据,从而导致第一个事务使用的数据被损坏,即所谓"变脏"。
  • 不可重复的读 如果一个事务获得了数据,而该数据随后被另一个事务所更改,那么第一个事务再次读取更改后的数据,就会发生不可重复的读。
  • 虚读 如果一个事务通过某种查询获取了数据,另一个事务修改了该数据的一部分,那么原来的事务第二次获取该数据时,就会发生虚读。     为了解决这些由于多个用户请求相同数据而引起的问题,事务之间必须用锁相互隔开。多数主流的数据库支持不同类型的锁;因此,JDBC API支持不同类型的事务,它们由 Connection对象的setTransactionLevel方法指定。在JDBC API中可以获得下列事务级别:
  • TRANSACTION_NONE 说明不支持事务。
  • TRANSACTION_READ_UNCOMMITTED 说明一个事务在提交前其变化对于其他事务来说是可见的。这样脏读、不可重复的读和虚读都是允许的。
  • TRANSACTION_READ_COMMITTED 说明读取未提交的数据是不允许的。这个级别仍然允许不可重复的读和虚读产生。
  • TRANSACTION_REPEATABLE_READ 说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。
  • TRANSACTION_SERIALIZABLE 是最高的事务级别,它防止脏读、不可重复的读和虚读。     运行在TRANSACTION_SERIALIZABLE模式下的事务可以保证最高程度的数据完整性,但事务保护的级别越高,性能损失就越大。     假设我们现在有一个Connection对象con,那么设置事务级别的方法如下:     con.setTransactionLevel(TRANSACTION_SERIALIZABLE) ;     你也可以使用getTransactionLevel()方法来获取当前事务的级别:     con.getTransactionLevel();     在默认情况下,JDBC驱动程序运行在"自动提交"模式下,即发送到数据库的所有命令运行在它们自己的事务中。这样做虽然方便,但付出的代价是程序运行时的开销比较大。我们可以利用批处理操作减小这种开销,因为在一次批处理操作中可以执行多个数据库更新操作。但批处理操作要求事务不能处于自动提交模式下。为此,我们首先要禁用自动提交模式:     con.setAutoCommit(false);     下面是一个批处理操作的例子: Statement stmt = connection.createStatement() ; stmt.addBatch("insert into tbl_User values('Jordan', 5000, 40) ; stmt.addBatch("insert into tbl_User values (Johnson', 1500, 24) ; stmt.addBatch("insert into tbl_User values ('Jackson', 6400, 18) ; int[] updateCounts = stmt.executeBatch() ; con.commit() ;     executeBatch()方法返回一个更新计数的数组,每个值对应于批处理操作中的一个命令。批处理操作可能会抛出一个类型为BatchUpdateException的异常,这个异常表明批处理操作中至少有一条命令失败了。(T111) 本文选自飞思图书《精通Java核心技术》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Oracle数据库几种启动方式

    Oracle数据库几种启动方式   1、startup nomount ...

    阿新
  • 打开WHR-HP-G54-AP的HP(High Power)功能

    打开WHR-HP-G54-AP的HP(High Power)功能,也就是高功率的意思。 telnet登陆路由器,在开始→运行中输入telnet 192.168....

    阿新
  • jquery easyui datagrid mvc server端分页排序筛选的实现

    1自定义一个ModelBinder public class filterRule { public string field { g...

    阿新
  • spring的事物 原

        Spring事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法...

    尚浩宇
  • 事务分类---innodb存储引擎笔记+闲扯

    事务想必大家都比较熟悉,我们可能张口就来ACID,但是事务的分类,之前我没怎么关心过,今天看姜大神的书MySQL技术内幕---innodb存储引擎看到了这...

    AsiaYe
  • 【面试】Spring事务面试考点吐血整理(建议珍藏)

    Spring和事务的关系 关系型数据库、某些消息队列等产品或中间件称为事务性资源,因为它们本身支持事务,也能够处理事务。 Spring很显然不是事务性资源,...

    Java3y
  • 面试必会的 MySQL 中的事务问题!

    事务(Transaction) 是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都 执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库...

    好好学java
  • Spring源码剖析8:Spring事务概述

    事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。

    Java技术江湖
  • 有关Spring事务,看这一篇就足够了

    编程式事务管理是侵入性事务管理,使用TransactionTemplate或者直接使用PlatformTransactionManager,对于编程式事务管理,...

    全菜工程师小辉
  • 数据库事务详解

    什么是『事务』? 事务就是一组具有原子性的操作,这一组操作要么全都正确执行,要么全都不执行。 事务能保证数据库从一种一致性状态转换为另一种一致性状态。 事...

    大闲人柴毛毛

扫码关注云+社区

领取腾讯云代金券