Java事务管理学习之JDBC详解

  


  

  

通常的观念认为,事务仅与数据库相关。
  

  

事务必须服从ISO/IEC所制定的酸原则.ACID是原子性(原子性)、一致性(一致性),隔离性(隔离)和持久性(持久性)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
  

  

通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
  

  

既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系?
  

  

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

  

  

1)原子性(原子性):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。

  

2)一致性(一致性):事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。

  

3)隔离性(隔离):一个事务的执行不能被其他事务所影响。

  

4)持久性(耐久性):一个事务一旦提交,事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。

  

事务(事务):是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,sql server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。事务通常是以开始事务开始,以提交或回滚结束.Commint表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据的更新写回到磁盘上的物理数据库中去,事务正常结束.Rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态。

  

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

  

显式事务:以开始事务显示开始,以提交或回滚结束。

  

隐式事务:当连接以隐式事务模式进行操作时,sql server数据库引擎实例将在提交或回滚当前事务后自动启动新事务。无须描述事物的开始,只需提交或回滚每个事务。但每个事务仍以提交或回滚显式结束。连接将隐性事务模式设置为打开之后,当数据库引擎实例首次执行下列任何语句时,都会自动启动一个隐式事务:alter table,插入、创建、开放、删除、取消、删除、选择、获取、截断表,格兰特,更新在发出提交或回滚语句之前,该事务将一直保持有效。在第一个事务被提交或回滚之后,下次当连接执行以上任何语句时,数据库引擎实例都将自动启动一个新事务。该实例将不断地生成隐性事务链,直到隐性事务模式关闭为止。

  

  

在使用JDBC的时候,如何进行事务的管理。直接看一下代码

  

<强>示例代码

     /* *   * @Title: JDBCTrans.java   * @Package com.oscar999.trans   * @Description:   * @author XM   2017年* @date 2月14日4:38:27点   * @version V1.0   */包com.oscar999.trans;      进口java.sql.Connection;   进口java.sql.DriverManager;   进口java.sql.SQLException;   进口java.sql.Statement;/* *   * @author   *   */公开课JDBCTrans {      公共JDBCTrans () {      }/* *   *   * @param sHostName   * @param sPortNumber   * @param名称   * @param用户名   * @param密码   * @return   * @throws SQLException异常   */sPortNumber sHostName公共连接getConnection(字符串,字符串,字符串名称,用户名的字符串,字符串密码)throws SQLException {   连接康涅狄格州=零;   字符串url=getOraclURL (sHostName、sPortNumber sSid);   康涅狄格州=DriverManager.getConnection (url、用户名、密码);   返回康涅狄格州;   }/* *   *   * @param康涅狄格州   * @param sql   * @throws SQLException异常   */公共空间添加(连接康涅狄格州,字符串sql) throws SQLException {   声明支撑=零;   尝试{   支撑=conn.createStatement ();   stmt.execute (sql);   }捕捉(SQLException e) {//TODO自动生成的catch块   e.printStackTrace ();   最后}{   如果(支撑!=null)   stmt.close ();   }   }/* *   * @param arg游戏   */公共静态void main (String [] args) {//TODO自动生成方法存根   字符串sHostName=" ";   字符串sPortNumber=" ";   字符串名称=" ";   字符串的用户名=" ";   字符串密码=" ";      sHostName=" ";   sPortNumber=" ";   名称=" ";   用户名=" ";   密码=" ";      尝试{   forname (“oracle.jdbc.driver.OracleDriver”);   }捕捉(ClassNotFoundException e1) {//TODO自动生成的catch块   e1.printStackTrace ();   }      JDBCTrans JDBCTrans=new JDBCTrans ();   连接康涅狄格州=零;   尝试{   康涅狄格州=jdbcTrans。getConnection (sHostName sPortNumber,名称、用户名、密码);   conn.setAutoCommit(假);//不能插入、更新//1。添加SQL   字符串addSQL="插入TEST_TABLE值(“name1”、“value1”)”;   jdbcTrans.add(康涅狄格州,addSQL);      }捕捉(SQLException e) {//TODO自动生成的catch块   e.printStackTrace ();   最后}{/*如果(康涅狄格州!=null)   {   尝试{   conn.close ();   }捕捉(SQLException e) {//TODO自动生成的catch块   e.printStackTrace ();   }   } */}      }      sPortNumber sHostName getOraclURL私人字符串(字符串,字符串,字符串sSid) {   字符串url=" jdbc: oracle:薄:@”+ sHostName +”:“+ sPortNumber +”:“+名称;   返回的url;   }      }

Java事务管理学习之JDBC详解