发表于: 2018-02-08 20:16:19

1 686


今天完成的内容:

(1)又撸了一遍mybatis

(2)java事务


概念:事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。通常的观念认为,事务仅与数据库相关。

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

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

例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

 

特性:事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响

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

JDBC事务

JDBC的一切行为包括事务是基于一个Connection的,在JDBC中是通过Connection对象进行事务管理。在JDBC中,常用的和事务相关的方法是: setAutoCommit、commit、rollback等。

例子,转账过程中,将对数据库的两个操作写到同一个事务中:

public void JdbcTransfer() { 

    java.sql.Connection conn = null;

     try{ 

        conn = conn =DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","userpwd");

         // 将自动提交设置为 false,

         //若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交

         conn.setAutoCommit(false);

         stmt = conn.createStatement(); 

         // 将 A 账户中的金额减少 500 

         stmt.execute("\

         update t_account set amount = amount - 500 where account_id = 'A'");

         // 将 B 账户中的金额增加 500 

         stmt.execute("\

         update t_account set amount = amount + 500 where account_id = 'B'");

         // 提交事务

         conn.commit();

         // 事务提交:转账的两步操作同时成功

     } catch(SQLException sqle){            

         try{ 

             // 发生异常,回滚在本事务中的操做

            conn.rollback();

             // 事务回滚:转账的两步操作完全撤销

             stmt.close(); 

             conn.close(); 

         }catch(Exception ignore){ 

         } 

         sqle.printStackTrace(); 

     } 

}

项目规模增大,采取分布式结构后,jdbc事务管理不再满足需求



返回列表 返回列表
评论

    分享到