JDBC事务处理
1、数据库事务的描述
-
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
-
事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
-
为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。
生活小案例:假如小明银行卡中有100元,小李银行卡中也有100元。这时小明转账给小李50元。这时正确的结果应该是小明应该有50元,小李有150元。但是在转账的过程当中有可能会出现一些问题,当小明转账过去后 自己的银行卡扣除了50元,这是突然转账系统崩呢系统重启恢复时丢失了崩溃前的转账记录。这时虽然小明已经在崩的前一秒将钱已经转给了小李,自己的银行卡只有50元,但是小李的银行卡却还只有100元。这时就体现数据库事务的重要性呢!
总结:要么都成功,要么都失败!
2、jdbc事务处理
在JDBC中处理事务,都是通过Connection完成的。
同一事务中所有的操作,都在使用同一个Connection对象。
Connection的三个方法与事务有关:
-
setAutoCommit():设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么相当于开启了事务了(多个sql语句执行一个事务);con.setAutoCommit(false) 表示开启事务。
若此时 Connection 没有被关闭,还可能被重复使用,则需要恢复其自动提交状态 setAutoCommit(true)。尤其是在使用数据库连接池技术时,执行close()方法前,建议恢复自动提交状态。
-
commit():在所有的 SQL 语句都成功执行后,提交结束事务。
-
rollback():出现异常时回滚结束事务。
数据一旦提交,就不可回滚。
数据什么时候意味着提交?
- 当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
- 关闭数据库连接,数据就会自动的提交。如果多个操作,每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。
【小明向用户小李转账50案例】
public void JDBCTest() {
Connection conn = null;
try {
// 1.获取数据库连接
conn = JDBCUtils.