目录
一、什么是JDBC事务?
(1)事务概念。
(2)JDBC事务的实现。
1、提交。
2、回滚。
(3)生活中可以类比 JDBC 事务的例子。
1、以网上购物为例。
二、JDBC的四大事务(ACID)特征。
(1)基本概念。
(2)四大特征(ACID)。
1、原子性。(Atomicity)
2、一致性。(Consistency)
3、隔离性。(Isolation)
4、持久性。(Durability)
三、有关MySQL的事务提交。
(1)MySQL的事务自动提交??
1、查看是否自动提交:autocommit。(系统变量)
2、关闭MySQL的事务自动提交。
3、开启2个命令行窗口连接mysql服务器。
4、测试MySQL的事务隔离性。
5、演示回滚操作。
四、事务结束(提交与回滚)。
1、提交(COMMIT)。
2、回滚(ROLLBACK)。
一、什么是JDBC事务?
(1)事务概念。
- JDBC(Java Database Connectivity)事务是指一系列作为单个逻辑工作单元执行的数据库操作,这些操作要么全部成功——>提交,要么全部失败——>回滚,从而确保数据的一致性和完整性。
- 在JDBC中一般情况下都是默认自动的提交事务。
- 在同一个事务下,一组sql语句,要就全部成功,要求全部失败,不允许出现中间状态.
- 不允许出现中间状态。当一方成功,一方失败时,在事务的概念就是让双方都变成失败!也就是就算成功了——>也会进行回滚(还原)。
(2)JDBC事务的实现。
- 关于事务的实现与操作——是数据库(如:MySQL)提供服务的。
其中它的Connection对象的三个方法与事务相关。
setAutoCommit(boolean)方法:设置是否为自动提交事务。
如果true(默认值就是true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置false,那么就相当于开启了事务了;Connection对象.setAutoCommit(false)表示开启事务!!!
1、提交。
commit()方法:提交结束事务。Connection对象.commit()。
表示提交事务。一般写在代码靠后边,且没有异常,执行commit()。也就是一般写在try中。
2、回滚。
rollback()方法:回滚结束的事务。Connection对象.rollback()。
表示回滚事务:一般当出现异常的时候,执行rollback()。所以一般写在catch块中。
(3)生活中可以类比 JDBC 事务的例子。
1、以网上购物为例。
- 场景描述:当你在网上购物时,从选择商品、提交订单到支付货款,这一系列操作构成一个事务。
- 原子性体现:你提交订单时,系统会尝试从你的账户中扣除相应的货款,同时更新商家的库存和订单状态等信息。这些操作必须全部成功,要么都执行,完成购物流程;要么都不执行,回到购物前的状态,不存在只扣除货款但订单未生成,或者订单生成但货款未扣除等中间状态。
- 一致性体现:在购物前后,你的账户余额、商家的库存以及订单系统中的数据等都要保持一致性。比如,你购买了一件商品,支付成功后,你的账户余额减少,商家的库存相应减少,订单状态变为已支付,整个系统的数据始终保持平衡和一致。
- 隔离性体现:假设同时有多个用户在进行购物操作,每个用户的购物事务之间是相互隔离的。比如你在购买商品 A 的同时,另一个用户在购买商品 B,你们的操作互不干扰,各自的订单生成、库存更新、账户扣款等操作都独立进行,不会出现混淆或相互影响的情况。
- 持久性体现:当你完成支付,购物事务提交成功后,即使购物网站出现故障或你关闭了浏览器,你的订单信息、账户余额变化以及商家的库存更新等都已被持久化存储到数据库中,不会丢失。你可以随时查看订单状态,商家也能正常处理你的订单,数据的修改是永久性的。
二、JDBC的四大事务(ACID)特征。
(1)基本概念。
- ACID:是指数据库事务正确执行的四个基本特征。
- 即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特征简称"ACID"。
(2)四大特征(ACID)。
1、原子性。(Atomicity)
- 事务是一个不可分割的工作单位,事务中的所有操作要么全部成功,要么全部失败回滚。
- 也就是说,事务中的操作是一个整体,如同一个原子,不能再被分割成更小的部分进行单独处理。
- 也就是某一个事务在执行sql语句时,它是一个原子操作。
- 举例说明:
在银行转账操作中,从账户 A 转出 100 元到账户 B,这个事务包含了两个操作:一是从账户 A 的余额中减去 100 元,二是在账户 B 的余额中加上 100 元。这两个操作必须作为一个整体来执行,要么都成功执行,账户 A 的余额减少 100 元,同时账户 B 的余额增加 100 元;要么都不执行,两个账户的余额都保持不变,不存在部分执行的中间状态。
2、一致性。(Consistency)
- 事务必须使数据库从一个一致状态变换到另一个一致状态。
- 举例说明:
- 还是以银行转账为例,在转账事务开始前,所有账户的余额总和是一个固定值。
- 当转账事务执行完成后,无论转账是否成功,所有账户的余额总和应该与事务开始前保持一致。如果转账成功,那么账户 A 的余额减少,账户 B 的余额增加,总余额不变;如果转账失败,两个账户的余额都不变,总余额也不变,从而保证了数据的一致性。
- 在事务开始之前和结束之后,数据库的完整性约束没有被破坏,数据始终保持一致。
3、隔离性。(Isolation)
- 多个事务并发执行时,一个事务的执行不能被其他事务干扰,各个事务之间相互隔离,如同每个事务都在一个独立的环境中执行一样。
- 每个事务都感觉不到有其他事务在并发地执行,从而保证了每个事务的独立性和数据的准确性。也就是不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
- 这里面可能用到了数据库的"行锁"!类似于多线程,当一个事务在执行sql语句时,对数据进行增加、删除、修改时,其它事务是不允许进行操作的。
- 当某个事务在进行操作后且并没有提交时,其它事务是需要等待——>才能进行操作!
- 举例说明:
- 假设有两个用户同时对不同的账户进行操作,用户 A 从账户 C 向账户 D 转账,用户 B 从账户 E 向账户 F 转账。
- 这两个转账操作是两个独立的事务,在理想情况下,它们应该互不干扰,各自按照自己的流程执行,就好像是顺序执行一样,不会出现一个事务的操作影响到另一个事务的中间结果或最终结果的情况。
4、持久性。(Durability)
- 一旦事务提交成功,其对数据库中数据的改变就是永久性的。
- 即使数据库系统出现故障,如断电、崩溃等,这些修改也不会丢失,数据会被持久化到数据库中。
- 也就是:事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
- MySQL是通过写"日志文件"完成。MySQL会把操作先写到日志文件中,再去操作数据将其写到硬盘当中。
- 举例说明:
- 当银行转账事务提交后,数据库会将账户余额的变化记录到磁盘等存储介质上。
- 即使在提交事务后,数据库系统立即发生故障重启,重新恢复运行后,之前提交的转账操作对账户余额的修改依然存在,不会因为系统故障而回滚或丢失,确保了数据的持久性。
事务的这四大特征是保证数据库数据完整性和一致性的重要机制,在数据库操作以及各种涉及数据处理的系统中都起着关键作用。
三、有关MySQL的事务提交。
(1)MySQL的事务自动提交??
- MySQL 默认是自动提交事务的,即每一条 SQL 语句都会被当作一个单独的事务自动执行并提交。
- MySQL中有一个系统变量可以查看事务是否自动提交。
1、查看是否自动提交:autocommit。(系统变量)
- 登录进入mysql——>通过"show"命令查看"autocommit"全局变量,可以查看MySQL的事务的自动提交是否被打开。
show variables like 'autocommit';
- 命令行登录mysql——>可以查看到MySQL已经默认自动提交事务。
- ON表示已关闭自动提交。
- 原因:
- MySQL在事务进行过程中,未结束之前,它的DML语句是不会更改底层数据,只是将历史操作记录一下,在内存中完成记录,不会在硬盘完成更新记录。
- 只有在事务结束的时候,而且是成功的结束的时候,才会修改底层硬盘文件中的数据。
2、关闭MySQL的事务自动提交。
- 注意这里的操作是临时的关闭,而且只在当前命令行窗口生效!。真正的关闭需要改其配置文件!
- 具体的操作命令。
SET AUTOCOMMIT=0; #表示禁止MySQL的自动提交 SET AUTOCOMMIT=1; #表示开启MySQL的自动提交
- cmd命令行演示。OFF表示已关闭自动提交。
3、开启2个命令行窗口连接mysql服务器。
- 此时再开启一个命令行窗口——连接mysql服务器。
- 可以清楚的发现——在命令行关闭mysql事务自动提交是临时的,且单独作用一个cmd窗口!
4、测试MySQL的事务隔离性。
- 第一个cmd窗口(关闭事务自动提交)修改表的数据,但不提交事务。
- 第二个cmd窗口查询"第一个cmd窗口修改的表",看是否能看到"修改后"的表!
- (答案肯定是不能!因为第一个cmd窗口事务未提交!不会修改硬盘中的数据,只会修改内存中的数据)
- 由于一个事务修改对应的表数据后,没有结束(提交事务)。当另外一个窗口执行查看数据时,硬盘里面的数据还是原来的,并没有修改。
- 当使用命令:commit。就可以了提交事务,另外一边也成功看到修改的数据情况了。
- 而且cmd窗口1的一个事务执行修改表数据的sql,且不主动提交事务。也就是这条事务 在执行修改某行数据加了"行锁"。
- 而另外cmd窗口2一个事务也去执行修改的sql语句,这时它会卡着(一直等待提交)——事务隔离性。
5、演示回滚操作。
四、事务结束(提交与回滚)。
- 事务的结束通常有两种方式,即提交(COMMIT)和回滚(ROLLBACK)。
1、提交(COMMIT)。
(程序中sql都执行成功时——>执行事务提交操作)
- 具体含义:
- 当执行 COMMIT 语句时,意味着事务中的所有操作都已成功完成,并且对数据库所做的所有更改都将被永久性地保存到数据库中。
- 注意:一旦提交事务后,这些更改将成为数据库的新状态,对其他并发事务可见,并且在数据库系统出现故障后也不会丢失。
- 示例:假设在一个银行转账事务中,需要从账户 A 向账户 B 转账 1000 元。事务包含两个操作:从账户 A 的余额中减去 1000 元,以及在账户 B 的余额中加上 1000 元。当这两个操作都成功执行后,执行 COMMIT 语句,此时数据库中账户 A 的余额减少 1000 元,账户 B 的余额增加 1000 元的状态将被永久保存,转账操作完成且数据一致性得到保证。
- 注意事项:在提交事务之前,应该确保事务中的所有操作都符合业务逻辑和数据一致性的要求。提交后的数据将无法通过简单的回滚操作恢复,除非使用数据库的备份或其他恢复机制。某一个事务不允许重复的去提交!
2、回滚(ROLLBACK)。
(程序中有的sql执行成功,有的sql执行失败。执行成功的sql通过进行回滚操作,恢复到执行之前的状态)
- 具体含义:
- ROLLBACK 语句用于撤销事务中已执行的所有操作,将数据库恢复到事务开始之前的状态。
- 也就是当事务执行过程中出现错误,或者由于某些原因导致事务无法继续正常执行时,通常会使用 ROLLBACK 来取消已做的更改,以保证数据的一致性。
- 示例:在上述银行转账事务中,如果在从账户 A 减去 1000 元后,由于网络故障等原因导致向账户 B 增加 1000 元的操作无法执行,此时就需要执行 ROLLBACK 语句。执行后,账户 A 的余额将恢复到转账前的数值,就好像整个转账事务从未发生过一样,从而避免了数据不一致的情况。
- 注意事项:回滚操作应该谨慎使用,因为它会撤销事务中所有已执行的操作。在复杂的事务中,可能包含了多个对不同数据表的操作,回滚将把所有这些操作的结果都撤销。此外,回滚操作只能撤销未提交的事务,如果事务已经提交,则无法通过 ROLLBACK 来恢复数据,除非使用数据库的日志恢复等高级功能。