一、定义
事务就是逻辑上的一组操作,为了保证一组数据库操作,要么全部成功,要么全部失败。
二、ACID特性
1、原子性(Atomicity):一个事务中的多组操作,要么全部成功,要么全部失败。在事务提交(commit)成功之后,所有的操作都生效,提交失败,所有的操作都会回滚。
2、 一致性(Consistency):一个事务执行之前和执行之后数据库都必须处于一致性状态。在事务执行的过程中,只要事务未提交,就不会改变数据库的状态。提交之后事务已完成,此时数据库状态发生变化。
3、隔离性(Isolation):事务在执行过程中,是与外界完全隔离的,即使数据库发生了变更,事务中也获取不到。A 事务对数据库做的变更,在事务未提交之间,数据库中也看不到,B 事务中也看不到。
4、持久性(Durability):事务一旦提交,对数据库的变更就会持久化到磁盘,即使数据库发生异常重启,数据也不会丢失。
三、隔离级别
当数据库出现有多个事务同时执行时,就可能出现
脏读
,幻读
,不可重复读
等问题,隔离级别就是为了解决这些问题的。隔离的越严实,效率就越低,并发越低,安全性越高。
隔离级别分为以下 4 种:
读未提交(read uncommitted,RU): 一个事务还未提交时,它做的变更就可以被别的事务看到。
读提交(read committed,RC):事务提交以后,它做的变更才能被其它事务看到。但是在这个事务未提交之前,数据库中发生的变更,这个事务也能看见。
可重复度(repeatable read,RR): 事务总是只能看见在启动的那个时刻,数据库的状态。事务未提交之前做的变更,其它事务看不见。事务执行期间,数据库中已经发生的变更,这个事务也看不见。只能看见事务刚启动时刻,数据库的状态。
串行化(serializable): 事务对某一行的操作会加锁,“写”会加“写锁”,“读”会加“读锁”,在锁释放掉之前,其它的事务都无法都这一行的记录进行操作。必须等之前的事务执行完毕,释放锁。后面的事务又会重新加锁。
假设有以下两个事务,其中执行的操作如图,从上至下是时间先后顺序:
四、事务启动
(1)获取连接 Connection con = DriverManager.getConnection();
(2)开启事务con.setAutoCommit(true/false);
(3)执行CRUD:增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。
(4)提交事务/回滚事务 con.commit() / con.rollback();
(5)关闭连接 conn.close()。
使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng
自动完成。
三、回滚