事务的概念最开始出现在关系型数据库中,英文解释如下:
A database transaction is a larger unit that frames multiple SQL statements. A transaction ensures that the action of the framed statements is atomic with respect to recovery.
事务是确保"同时成功则成功,任何一个失败则失败"的一种机制。一个事务往往包括三种动作行为:开始事务(Begin Transaction),提交事务(Commit)和回滚(Rollback)。从开始事务到提交事务过程中所发生的一切数据库修改要么同时成功(被Commit,固化在数据库中),要么一个失败,大家同时回复原有状态(Rollback,数据库回复到事务开始时的状态)。
简单的理解:它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
事务基本属性:
事务的ACID特点分别是指原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
原子性(atomicity) :一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation) :一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability) :持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
import java.sql.*;
/**
* 测试事务的基本用法
* @author Administrator
*
*/
public class TestCommit {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test","root","123456");
//JDBC中默认为自动提交,此处设为手动提交
conn.setAutoCommit(false);
ps = conn.prepareStatement("insert into user (name,age) values (?,?)");
ps.setObject(1, "王五");
ps.setObject(2, "13");
ps.executeUpdate();
System.out.println("ps插入的用户");
//此处SQL语句错误,抛出异常,执行回滚操作
ps = null;
ps = conn.prepareStatement("insert into user (name,pwd) values (?,?,?)");
ps.setObject(1, "李四");
ps.setObject(2, "123456");
ps.executeUpdate();
System.out.println("ps1插入的用户");
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}