之前学数据库的时候没太注意事务这个概念,在平时练习的时候也基本上没用到,但是这是一个非常有用的概念,值得好好学习。这篇文章主要讲的是关于事务概念的非常基础的知识以及用JDBC来管理事务,不涉及事务的一些高级概念。
一、数据库“事务”概述
==数据库事务( transaction)==是指访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
简单来说,事务可以理解为这样的一组操作集合:对于某些操作之间,若不能“同步”,便会带来严重错误,于是将这些操作组成一个事务,然后管理事务来统一管理这个操作。例如,在购物时,有两个基本操作:付钱和交货。如果付了钱不交货或不付钱就交货,这都会引起错误。此时便可以把付钱和交货这两个操作组成一个事务来处理(注意规定付钱在前,交货在后,付钱后一定交货),这样便可避免由于操作不同步而产生的错误。
二、数据库“事务”的特点
-
原子性
事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行 -
一致性
几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致 -
隔离性
并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样 -
持久性
事务一旦提交,其对数据库的更新就是持久的,任何事务或系统故障都不会导致数据丢失
三、数据库常见并发异常
-
丢失修改
一个事务覆盖了其他事务对数据的已提交修改,导致这些修改好像丢失了一样 -
脏读
一个事务读取了其他事务还未提交的数据 -
不可重复读
一个事务对同一数据的读取结果前后不一致 -
幻读
一个事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。
数据库事务的存在一方面本身就是为了减少错误,另一方面通过事务处理可以在发生错误时很方便地恢复到错误发生前的状态。
为了避免出现上面的异常,可通过事务的隔离级别来处理,有关隔离级别的内容,可参考大佬的博客事务的四种隔离级别,这里暂不做讨论。
四、数据库“事务”的基本操作
- 开启
- 提交
- 回滚
当发生数据库错误时,需要将数据库恢复到发生错误前的状态。
在JDBC里面,使用Connection对象来管理事务:
-
setAutoCommit(false)
表示开启事务 -
commit()
提交结束事务 -
rollback()
回滚结束事务
代码格式如下
try{
con.setAutoCommit(false);//开启事务
......
con.commit();//try的最后提交事务
} catch() {
con.rollback();//回滚事务
}
2019.12.22