- 什么是事务
一个事务是由一条或几条数据库操作的SQL语句所组成的一个不可分割的工作单元。事务必须服从ACID原则,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
通俗理解,事务就是一组原子操作单元,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。即,要么全部执行成功,要么撤销不执行。
- 结束事务的操作
1. commit()方法,表示完成对事务的提交
2. rollback()方法,表示完成事务回滚,多用于在处理事务过程中出现了异常的情况。
一般而言,事务默认操作是自动提交,即操作成功后,系统将自动调用commit()方法,否则将调用rollback()方法。
- 5种事务隔离级别
1. TRANSACTION_NONE JDB。不支持事务。
2. TRANSACTION_READ_UNCOMMIT。未提交读。说明在提交前一个事务可以看到另一个事务的变化。允许“脏”读、不可重复读和虚读。
3. TRANSACTION_READ_COMMIT。已提交读。说明读取未提交的数据是不允许的。允许不可重复读和虚读。
4. TRANSACTION_REPEATABLE_READ。可重复读。说明事务保证能够再次读取相同的数据而不会失败,但仍允许虚读。
5. TRANSACTION_SERIALIZABLE。可序列化。是最高的事务级别。能防止“脏”读,不可重复读和虚读。
- “脏”读: 一个事务读取了另一个事务尚未提交的数据。
- 不可重复读:一个事务的操作导致另一个事务前后读取到不同的数据。
- 虚读:一个事务导致另一个事务前后两次查询的结果数据量不同。(例如,当事务A与事务B并发执行时,当事务B查询读取数据后,事务A新增或删除了一条满足事务A的查询条件记录,此时,事务B再次查询,发现查询到当次不存在的记录,或者前次的某个记录不见了。)
事务隔离级别越高,为避免冲突所花的精力也就越多。可以通过Connection对象的conn.setTransactionLevel()方法来设置隔离级别,通过conn.getTransactionIsolation()方法来确定当前事务的级别。