事务管理:
事务管理是对于一系列数据库操作进行管理,一个事务包含一个或多个SQL语句,是逻辑管理的工作单元(原子单元)。
一个事务是对数据库进行读和写的一个序列。传统数据库(RDB)中事务有两个明显的特性:原子性和可串行性。原子性意指事务中的读和写操作可看作是对数据库的单个原子操作。可串行性意指多个事务并发执行的效果与一次执行这些事务中的一个的效果相同。因而事务管理的任务就是保证事务的原子性和可串行性,它由两部分组成:并发控制和恢复。并发控制涉及到多个事务对数据库的某个公共部分进行同时存取的自动控制。恢复则涉及到将数据库恢复到事务故障之前业已存在的状态。
事务管理的四个特点:
1.1 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。
1.2 一致性(Consistency)
官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
换一种方式理解就是:事务按照预期生效,数据的状态是预期的状态。
1.3 隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
1.4 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
事务的隔离级别:
read uncommitted; 读未提交
read committed ;读已提交
repeatable read ;可重复读,有效防止脏读以及不可重复读 (mysql的默认隔离级别)
serializable ; 串行化(序列化) 隔离级别最高,安全性最高,效率最低!
JDBC事务管理操作步骤 :
public class jdbcdemo {
public static void main(String[] args) {
Connection connection=null;
PreparedStatement p1= null;
PreparedStatement p2 =null;
try {
connection= JDBCUtils.getConnection();
//开启事务
connection.setAutoCommit(false);
String sql1 ="update account set balance = balance -? where id = ?";
String sql2 ="update account set balance = balance +? where id = ?";
p1 = conn.prepareStatement(sql1);
p2 = conn.prepareStatement(sql2);
p1.setDouble(1,500);
p1.setInt(2,1);
p2.setDouble(1,500);
p2.setInt(2,2);
p1.executeUpdate();
p2.executeUpdate();
//数据提交
connection.commit();
} catch (Exception throwables) {
try {
if (connection!=null){
//数据回滚
connection.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JDBCUtils.close(p1,connection);
JDBCUtils.close(p2,connection);
}
}
}