一:事务(transaction)
事务规定了一组操作,这一组操作作为一个整体,要么全部成功,要么全部失败。
事务的特性(ACID):
1.原子性(Atomic)
事务作为一个整体而存在,事务内的操作不可再分割,
要么全部成功,要么全部失败。
2.一致性(Consistent)
事务操作成功之前与之后,数据状态要保持一致。
3.隔离性(Isolation)
一个事务只能查看其他事务操作之前的状态或之后的状态,
不能查看其正在操作的状态。
4.持久性(Duration)
一旦事务操作成功,则对数据系统的影响是持久性的。
二:事务的隔离级别
几个前提概念:
脏读(dirty read):一个事务读取到了另一个事务未提交的数据的现象。
不可重复读:一个事务两次读取的数据不一致的现象。
幻读:一个事务两次读取的数据记录数(数据条目的数量)不一致的现象。
隔离级别:
1.读未提交级别(read uncommitted):
一个事务读取到了其他事务还未提交状态的数据。
可能发生脏读、不可重复读、幻读。
2.读提交级别(read committed):
一个事务只能读取其他事务已经提交之后状态的数据。
可能会发生不可重复读,幻读。
3.可重复读级别(repeatable read,MySQL默认的隔离级别)
在当前事务中可以重复读取到相同的数据。
可能会发生幻读(注意:Innodb数据库存储引擎已经解决了幻读问题)。
4.串行化隔离级别(serializable)
事务的操作(主要是指写操作)是串行化的。
在CMD中操作事务:
start transaction; // 开启事务
select @@tx_isolation; // 查看当前事务隔离级别
// 设置当前会话的事务隔离级别
set session transaction isolation level read uncommitted || read committed || repeatable read || serializable;
rollback; // 回滚事务(相当于撤销操作)
savepoint 保存点名称; // 设置保存点
rollback to 保存点名称; // 回滚到保存点的状态
commit; // 提交事务
三:JDBC批处理、处理事务操作
JDBC批处理
方式一:使用PreparedStatement来进行批处理操作
void addBatch() // 将一组参数添加到此PreparedStatement对象的批处理命令中
int[] executeBatch() // 执行批处理命令
方式二:使用Statement来进行批处理操作
如何获取Statement对象?
Statement stmt=connection.createStatement();
int count=stmt.executeUpdate(String sql); // 执行静态的增删改SQL语句
ResultSet rs=stmt.executeQuery(String sql); // 执行静态的查询SQL
Statement对象用来处理批处理的方法:
addBatch(String sql) // 将给定的SQL命令添加到此Statement对象的当前命令列表中
int[] executeBatch() // 执行批处理命令
JDBC处理事务:
Connection对象的方法:
1. setAutoCommit(boolean autoCommit) // 设置自动提交状态
conn.setAutoCommit(false); // 取消自动提交模式
2. void commit() // 提交事务
3. void rollback() // 回滚整个事务
4. Savepoint setSavepoint() // 设置保存点
5. void rollback(Savepoint savepoint) // 回滚到保存点
事务规定了一组操作,这一组操作作为一个整体,要么全部成功,要么全部失败。
事务的特性(ACID):
1.原子性(Atomic)
事务作为一个整体而存在,事务内的操作不可再分割,
要么全部成功,要么全部失败。
2.一致性(Consistent)
事务操作成功之前与之后,数据状态要保持一致。
3.隔离性(Isolation)
一个事务只能查看其他事务操作之前的状态或之后的状态,
不能查看其正在操作的状态。
4.持久性(Duration)
一旦事务操作成功,则对数据系统的影响是持久性的。
二:事务的隔离级别
几个前提概念:
脏读(dirty read):一个事务读取到了另一个事务未提交的数据的现象。
不可重复读:一个事务两次读取的数据不一致的现象。
幻读:一个事务两次读取的数据记录数(数据条目的数量)不一致的现象。
隔离级别:
1.读未提交级别(read uncommitted):
一个事务读取到了其他事务还未提交状态的数据。
可能发生脏读、不可重复读、幻读。
2.读提交级别(read committed):
一个事务只能读取其他事务已经提交之后状态的数据。
可能会发生不可重复读,幻读。
3.可重复读级别(repeatable read,MySQL默认的隔离级别)
在当前事务中可以重复读取到相同的数据。
可能会发生幻读(注意:Innodb数据库存储引擎已经解决了幻读问题)。
4.串行化隔离级别(serializable)
事务的操作(主要是指写操作)是串行化的。
在CMD中操作事务:
start transaction; // 开启事务
select @@tx_isolation; // 查看当前事务隔离级别
// 设置当前会话的事务隔离级别
set session transaction isolation level read uncommitted || read committed || repeatable read || serializable;
rollback; // 回滚事务(相当于撤销操作)
savepoint 保存点名称; // 设置保存点
rollback to 保存点名称; // 回滚到保存点的状态
commit; // 提交事务
三:JDBC批处理、处理事务操作
JDBC批处理
方式一:使用PreparedStatement来进行批处理操作
void addBatch() // 将一组参数添加到此PreparedStatement对象的批处理命令中
int[] executeBatch() // 执行批处理命令
方式二:使用Statement来进行批处理操作
如何获取Statement对象?
Statement stmt=connection.createStatement();
int count=stmt.executeUpdate(String sql); // 执行静态的增删改SQL语句
ResultSet rs=stmt.executeQuery(String sql); // 执行静态的查询SQL
Statement对象用来处理批处理的方法:
addBatch(String sql) // 将给定的SQL命令添加到此Statement对象的当前命令列表中
int[] executeBatch() // 执行批处理命令
JDBC处理事务:
Connection对象的方法:
1. setAutoCommit(boolean autoCommit) // 设置自动提交状态
conn.setAutoCommit(false); // 取消自动提交模式
2. void commit() // 提交事务
3. void rollback() // 回滚整个事务
4. Savepoint setSavepoint() // 设置保存点
5. void rollback(Savepoint savepoint) // 回滚到保存点