事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部执行,要么全部失败!!!
数据库开启事物的命令:Connection接口下面的方法!!:
Connection接口下面的方法:
1、void setAutoCommit(boolean autoCommit);
autoCommit - 为 true 表示启用自动提交模式;
为 false 表示禁用自动提交模式(默认情况下就是true)
2、void commit();手动提交事物。
3、void rollback();回滚(出现异常的时候,所有已执行成功的代码需要回退到事务开始前的状态)
默认情况下,Connetion对象处于自动提交模式下,这意味着他在执行每个语句后都会自动提交更改。如果禁用自动提交模式,那么提交更改就必须显示调用commit方法,否则就无法保存数据库的更改。
结束事物:commit或rollback
COMMIT 表示提交,即事务中的多条 SQL 语句所更改的数据会持久化到数据库中。
ROLLBACK 表示回滚,即回滚到事务的起点,将之前所做的所有操作撤销。
ROLLBACK 可以结束事务,但不代表会将数据持久化到数据库中,而只有 COMMIT提交才可以将数据持久化到数据库中。
private Connection conn = null;
private PreparedStatement ps = null;
try {
conn.setAutoCommit(false); //将自动提交设置为false
ps.executeUpdate("修改SQL"); //执行修改操作
ps.executeQuery("查询SQL"); //执行查询操作
conn.commit(); //当两个操作成功后手动提交
} catch (Exception e) {
conn.rollback(); //一旦其中一个操作出错都将回滚,使两个操作都不成功
e.printStackTrace();
}
事务(transaction)四个基本特性或ACDI特定!!!:
1、Atomicity(原子性):一个事务(transaction)中的所有操作,全部完成,或者全部不完成,不会结束在中间某个环节,只执行一部分的操作。
事务在执行过程中如果发生错误,会被回滚(rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割,不可约减
2、Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
3、Isolation(隔离性):数据库允许多个并发事物对其进行读写和修改的功能,隔离性可以防止事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离分为不同级别:包括未提交读(Read unconmmitted)、提交读(read commited)、可重复读(repeatable read)和串行化(Serializeable)。
4、Durability(持久性):事务处理结束后,对数据的修改就是永久的,系统故障也不会丢失
Spring的事务传播特性(属性)!:
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务。
Propagation的属性
- REQUIRED:如果存在一个事务,则支持当前事务,如果没有事务则开启事物(原来就有使用的事务,没有就创建事务,一般Service中的更新类使用的操作)
- SUPPORTS:如果存在一个事务,则支持当前事务,如果没有事务,则非事务的执行(原来就有事务,就使用原来的事物,如果没有就算了,一般使用在Service的查询操作)
- REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
-
MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
-
NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。
-
NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常
-
NESTED:如果有就嵌套、没有就开启事务