事务

一、什么是事务?

  事务是为了保持数据安全性提出的,作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

  事务必须服从ISO/IEC(国际电工委员会)制定的ACID原则。ACID是atomicity原子性、consistency一致性、isolation隔离性和durability持久性的简称。


原子性:如果全部事务执行成功,所有的数据库操作执行成功,数据库状态发生改变;如果任何一个子事务执行失败,则其他子事务将回滚到事务执行前的状态,数据库状态不会改变。

一致性:数据库在事务提交前和提交后,其中的数据必须满足业务规则约束。

隔离性:在一个事务正确提交之前,不允许把该事务对数据的任何改变提交给任何其他事务。

持久性:事务正确提交后,数据永久保存在数据库。


拓展:MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务、行级锁、并发 3.Berkeley DB:支持事务


二、Java事务的类型

    Java的事物有三种类型:JDBC事务,JTA事务,容器事务。

1、JDBC事务

JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手动提交。

自动模式。

java.sql.Connection 提供了以下控制事务的方法:
setAutoCommit(boolean)、getAutoCommit()、commit()、rollback()


  下面来看下JDBC事务的例子:

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 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。

一个 JDBC 事务不能跨越多个数据库。



2、JTA(Java Transaction API)事务

拿电商网站来说,我们一般把一个电商网站横向拆分成商品模块、订单模块、购物车模块、消息模块、支付模块等。

然后我们把不同的模块部署到不同的机器上,各个模块之间通过远程服务调用(RPC)等方式进行通信。以一个分布式

的系统对外提供服务。一个支付流程就要和多个模块进行交互,每个模块都部署在不同的机器中,并且每个模块操作

的数据库都不一致,这时候就无法使用JDBC来管理事务,JTA事务应运而生。


3、容器事务

容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。

Spring容器事务就是很好的例子。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值