一、什么是事务
百度百科中解释:指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
简单的说,事务就是并发控制的单位,是用户定义的一个操作序列。
而一个逻辑工作单元要成为事务,就必须满足ACID属性。
A:原子性(Atomicity)
事务中的操作要么都不做,要么就全做。
C:一致性(Consistency)
事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态。
通俗理解就是事务操作前后,数据总量不变
I:隔离性(Isolation)
一个事务的执行不能被其他事务干扰
D:持久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
二、事务中存在的问题
1、脏读:一个事务读取到另外一个事务未提交的数据
2、不可重复读:在同一个事务中,两次读取到的数据不一样
3、幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
三、事务的隔离级别
1 | 1.读未提交(Read Uncommitted) |
四、JDBC中的体现
(一)数据库定义了4个隔离级别:
1、Read uncommitted【级别最低,什么都避免不了】
2、Read committed【可避免脏读】
3、Repeatable read【可避免脏读,不可重复读】
4、Serializable【可避免脏读,不可重复读,虚读】
(二)分别对应Connection类中的4个常量
- TRANSACTION_READ_UNCOMMITTED
- TRANSACTION_READ_COMMITTED
- TRANSACTION_REPEATABLE_READ
- TRANSACTION_SERIALIZABLE
五、JDBC实现事务管理
转账案例:李四和王五账户都有1000块,现在李四给王五转账500块,使用事务来操作
首先,当我们没有使用事务时:
1 | public class JdbcDemo1 { |
以上代码在程序处理过程中没有出现异常时,是可以正确执行的,但是在实际场景下,这可是没法保证的,所以现在手动模拟异常,如下:
1 | pstat1.executeUpdate(); |
显然,上面代码是会抛出异常的,我们再来查询一下数据。通过查看发现李四账户少了500块钱,但是王五账户上的钱却没有增加,这明显是不合理的。
现在通过添加事务来进行处理:
1 | public class JdbcDemo10 { |
上面的程序当然也一样抛出了异常,但通过查询会发现李四账户钱没有减少,并且王五账户的钱也没有增加。
因此就通过JDBC来实现了事务管理。
参考博客:
JDBC第三篇【事务、元数据、改造JDBC工具类】(修订版)
数据库中,什么是事务?
Java新手,若有错误,欢迎指正!