一、什么是事务?
事务是为了保持数据安全性提出的,作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
事务必须服从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容器事务就是很好的例子。