java事务

12 篇文章 0 订阅
1 篇文章 0 订阅

了解一下java 中的事务

1 什么是事务?

       通常我们所说的事务是指数据库中的事务(总是认为其与数据库相关),也就是数据库操作过程中的的一系列原子操作(从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行)。事务必须有四个原则:原子性、一致性、隔离性、持久性。

       实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。

 

2 我们思考下是为了什么目的或者说为了达到什么目标,导致了“事务”的出现?

       举一个简单例子:比如银行转帐业务,账户A要将自己账户上的1000元转到B户下面,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失败,那么整个业务失败。

换句话说,本来是一系列原子性的操作,可是中间出现一些问题,导致数据错误。对于我们这些爱财如命的俗人来说,绝对是不可原谅的。So,事务就出现了。也就是说,为了不出现财产数据错误导致银行被用户喷死的情况产生,必须保证数据操作的正确性à事务(被发明出来了)。操作要么全部执行成功,要么操作全部撤销,这样就保持了数据的安全性

 

3 java事务是如何实现的?

Java事务的类型有三种:JDBC事务、JTAJava Transaction API)事务、容器事务。

 

我们主要分析一下 JDBC事务。

JDBC事务:

       我们首先了解一下JDBC是什么东东,JDBCJava DataBase Connectivity,java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。----百度百科)

下图为架构图,它显示了驱动程序管理器相对于JDBC驱动程序和Java应用程序的位置 

温故知新:JDBC API提供以下接口和类

·       DriverManager:此类管理数据库驱动程序列表。使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序进行匹配。在JDBC下识别某个子协议的第一个驱动程序将用于建立数据库连接。

·       Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。但会使用DriverManager对象来管理这种类型的对象。它还提取与使用Driver对象相关的信息。

·       Connection:此接口具有用于联系数据库的所有方法。连接(Connection)对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。

·       Statement:使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。

·       ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器并可移动ResultSet对象查询的数据。

·       SQLException:此类处理数据库应用程序中发生的任何错误。

 

JDBC Connection 接口(java.sql.Connection )提供了两种事务模式:自动提交和手工提交。java.sql.Connection 提供了以下控制事务的方法:

public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
     
使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个JDBC 事务不能跨越多个数据库。

事务通常是以begintransaction开始,以commitrollback结束。Commint表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据的更新写回到磁盘上的物理数据库中去,事务正常结束。Rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态。

自动提交事务:每条单独的语句都是一个事务。每个语句后都隐含一个commit(默认)

显式事务:以begintransaction显示开始,以commitrollback结束。

隐式事务:当连接以隐式事务模式进行操作时,sql server数据库引擎实例将在提交或回滚当前事务后自动启动新事务。

一个原理实现例子供大家参考(手动提交):

private Connection conn = null;  

private PreparedStatement ps = null;  

try {  

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

    ps.executeUpdate("修改SQL");//执行修改操作  

    ps.executeQuery("查询SQL"); //执行查询操作                 

    conn.commit();     //当两个操作成功后手动提交  

} catch (Exception e) {  

    conn.rollback();    //一旦其中一个操作出错都将回滚,使两个操作都不成功  

    e.printStackTrace();  

}  

2.事务隔离级别(TransactionIsolation Levels)

JDBC提供了5种不同的事务隔离级别,在Connection中进行了定义:

JDBC定义了五种事务隔离级别:

名称

解释

ISOLATION_DEFAULT

-1

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应

ISOLATION_READ_UNCOMMITTED

1

这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。

ISOLATION_READ_COMMITTED

2

保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。

ISOLATION_REPEATABLE_READ

4

这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。

ISOLATION_SERIALIZABLE

8

这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。

        隔离级别越高,越能保证数据的完整性和一致性,但是对并发的效率就越低。一般情况下,采用读已提交或者可重复读,它能够有效避免脏读和不可重复读。

参考文章:

http://blog.csdn.net/sinat_33536912/article/details/51200630


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值