JDBC六:数据库事务
数据库事务
一、事务介绍
事务:一组逻辑操作单元,使数据从一种状态转换到另一种状态
一组逻辑操作单元:一个或多个DML操作
一致性:为保证一致性,数据的操作应当是离散的成组的逻辑单元。全部完成时,一致性保持;这个单元一部分操作失败,整个事务全部视为错误,应从起始点以后的操作全部退到开始状态。
二、事务处理
事务处理原则:
① 保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
② 当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
会导致数据自动提交的情况
解决自动提交问题的方法
① 调用Connection对象的setAutoCommit(false);取消自动提交事务
在所有的SQL语句都成功执行后,调用commit( )方法提交事务
在出现异常时,调用rollback( )方法回滚事务。
② 使用数据库连接池技术时,在执行close( ) 方法前,建议恢复自动提交状态setAutoCommit(true)
考虑事务处理后的通用操作方法
@Test/** @title transactionCommon* @description 事务处理的通用调用方法* @author e_n* @updateTime 2022/1/26 17:51*/public void transactionCommon() {Connection conn = null;try {// 1.建立连接conn = JdbcUtils.getConnection();// 2.取消了自动提交事务conn.setAutoCommit(false);// 3.执行sql语句// 3.1 sql语句1,并执行String sql1 = "update user_table set balance = balance - 100 where user = ?";update(conn,sql1,"AA");// 模拟网络异常System.out.println(10/0);// 3.2 sql语句2,并执行String sql2 = "update user_table set balance = balance + 100 where user = ?";update(conn,sql2,"BB");// ...可执行多个sql语句// 4.若没有异常,则提交事务conn.commit();} catch (Exception e) {e.printStackTrace();try {// 5.若有异常,则回滚事务conn.rollback();} catch (SQLException throwables) {throwables.printStackTrace();}} finally {try {// 6.恢复每次DML操作的自动提交功能conn.setAutoCommit(true);} catch (SQLException throwables) {throwables.printStackTrace();}// 7.关闭连接JdbcUtils.closeResource(conn,null);}}@Test/** @title update* @description 事务处理的通用增删改方法,要避免调用一次后就关闭conn引发数据库提交,所以需要将conn以参数形式引入* @author e_n* * @updateTime 2022/1/26 17:53*/public void update(Connection conn, String sql, Object...args) {PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {ps.setObject(i+1,args[i]);}ps.execute();} catch (SQLException throwables) {throwables.printStackTrace();} finally {// 因为conn是以参数形式引入的,所以无法关闭,故在关闭程序中的conn参数为nullJdbcUtils.closeResource(null,ps);}}
三、数据库的并发问题
事务的ACID属性
原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):指事务必须使数据库从一个一致性状态变换到另一个一致性状态
隔离性(Isolation):指一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务时隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变是永久性的,接下来的其它操作和数据库故障不应该对其有任何影响。
数据库的并发问题
同时运行多个事务,而这些事务又会访问数据库中的相同数据库时,如未对事务采取必要的隔离机制,就会引发下述并发问题
① 脏读:对于两个事务T1和T2,T1读取了被T2更新但还没有被提交的字段。(不正常的)
② 不可重复读:对于两个事务T1和T2,T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不同了。(认为是合理的)
③ 幻读:对于两个事务T1和T2,T1读取了一个字段,然后T2在该表中插入了该字段。之后,T1再次读取同一个表,就会多出几行。(认为是合理的)
四、事务隔离级别
数据库提供的4种事务隔离级别
隔离级别 描述 默认隔离级别 READ UNCOMMITTED
读未提交数据允许事务读取未被其它事务提交的变更,
脏读、不可重复读和幻读的问题都会出现READ COMMITED
读已提交数据只允许事务读取已经被其它食物提交的变更,
可以避免脏读,但不可重复读和幻读仍会出现Oracle
数据库默认REPEATABLE READ
可重复读确保事务可以多次从一个字段中读取相同的值,
在这个事务持续期内,禁止其它事务对这个字段进行更新,
可避免脏读和不可重复读,但幻读问题仍然存在MySQL
数据库默认SERIALIZABLE
串行化确保事务可以多次从一个表中中读取相同的行,
在这个事务持续期内,
禁止其它事务对这个表执行插入、更新和删除操作,
所有并发问题都可以避免,但性能低下在MySQL中设置隔离级别
① 创建mysql数据库的用户,并授予权限
// 1. MySQL5.7之前: // 1.1 创建mysql数据库的用户 create user 新建用户名 identified by '新建用户密码'; // 1.2 给新建用户授予在指定数据库下的所有表的增删改查的权限 grant select,insert,delete,update on 数据库名.* to 新建用户@localhost identified by '新用户密码'; // 1.3 给新建用户对于所有库所有表的全部权限 grant all privileges on *.* to 新建用户名@'%' identified by 'abc123';// 2. MySQL8.0之后: // 2.1 创建mysql数据库的用户 create user 新建用户名@localhost identified by '新建用户密码'; // 2.2 给新建用户授予在指定数据库下的所有表的增删改查的权限 grant select,insert,delete,update on 数据库名.* to 新建用户@localhost; // 2.3 给新建用户对于所有库所有表的全部权限 grant all privileges on *.* to 新建用户名@localhost;
② 查看当前的隔离级别
// MySQL5.7之前 select @@tx_isolation;// MySQL8.0之后 select @@transaction_isolotion;
③ 设置当前mysql连接的隔离级别
// MySQL5.7之前 set transaction isolation level read committed;// MySQL8.0之后 set session transaction isolation level read committed;
④ 设置数据库系统的全局的隔离级别
// 会改变该数据库系统下的所有用户的隔离级别 set global transaction isolation level read committed;
JDBC六:数据库事务相关推荐
- JDBC学习总结(二)JDBC操作Blob类型字段高效的批量插入JDBC处理数据库事务将多个SQL看成一个事务执行数据库连接池C3P0DBCPDruidDBUtils工具类实现CRUD
JDBC学习总结(二)JDBC操作Blob类型字段/高效的批量插入/JDBC处理数据库事务/将多个SQL看成一个事务执行/数据库连接池C3P0/DBCP/Druid/DBUtils工具类实现CRUD ...
- JDBC和数据库事务详解
现在还在写 JDBC 事务的文章,我觉得我一定是相当的 Out 了,现在主流的 java 应用,框架都是分布式的,各种分布式的事务,或者容器事务才是需要学习的重点,在这里谈 JDBC 确实有点不合时宜 ...
- JDBC(数据库和Java)
JDBC JDBC(Java数据库连接)是一种Java API(应用程序编程接口),允许Java程序与数据库交互.它提供了一个标准接口,用于从Java程序连接到关系数据库(如MySQL.Oracle和 ...
- Spring Boot中声明式数据库事务使用与理解
JDBC的数据库事务 传统JDBC的数据库事务的一个示例如下代码所示,该示例仅为一个insertUser方法的数据库事务过程.可以看到,如果还存在很多其他的数据库事务需要,则需要编写很多类似于如下的代 ...
- 使用JDBC进行数据库的事务操作(2)
本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...
- 隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别
文章目录 一.数据库事务简介 二.JDBC事务处理 三.事务的ACID属性 四.数据库的隔离级别 五.设置隔离级别 一.数据库事务简介 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态. 事务 ...
- java监听数据库操作_第十六篇——JDBC操作数据库之监听器
JavaWeb应用中,很多的地方都和session有关.因此session相关的事件监听器,在日常工作中非常有用. 有时候我们需要统计当前在线的人数和访问人数总数,此时就可以使用监听器技术来很简单的实 ...
- 六、JDBC操作数据库
文章目录 JDBC概述 概念 JDBC本质 JDBC好处 JDBC快速入门 JDBC API详解 DriverManager Connection 获取执行SQL的对象 管理事务 Statement ...
- 大数据WEB阶段(十八)数据库事务
数据库事务 一.概述 事务的概念 事务是指逻辑上的一组操作 , 组成这组操作的各个单元 , 要么全部成功 , 要么全部失败 . 如:银行转账.. 转账核心操作其实就是两条sql ,两条都执行成功才算成 ...
最新文章
- linux 下/proc/cpuinfo三级缓存,linux /proc/cpuinfo文件分析
- python勾股定理_Python学习第128课——在Python中实现醉汉随机游走
- ECMAScript 6 入门
- QT的QCommandLineOption类的使用
- 【Git】处理 Unable to access ‘https://github.com’: OpenSSL SSL_read: Connection was reset, errno 10054
- 有了PSD分层模板|花卉海报设计其实很简单!
- struts2 action中result参数详解
- 测试视频软件支持的格式,支持82种视频格式!电视平台最强的本地播放器!
- SmartView函数HypSetActiveConnection使用
- 通过js实现页面布局
- python 输出\xhh格式的16进制数据(改2)
- ESlint 自动格式化代码 补缺代码 添加空格
- ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8....Cortex-A53,A57,A72
- 【ANDROID 】交叉编译链工具
- Python3基本用法 2020.2.20
- 2022年怎样的企业才能迎难而上?这场年会给你答案
- 恋人间的80个小浪漫
- [IC笔试题] FIFO深度计算
- 坚果云+svn实现异地非局域网个人代码版本管理
- 《如何写好科研论文》《学术规范与论文写作》-长江雨课堂-2022秋季期末考试答案分享
热门文章
- 1020 月饼 ——C/C++实现
- 展望:2021年值得关注的5大投资方向
- ChatGPT: History is temporarily unavailable. We‘re working to restore this feature as soon as possib
- 数据库恢复(database restore)之兵不血刃——半小时恢复客户数据库
- Pangolin安装及问题
- g linux 未定义的引用_G ++ Cpp中的“未定义的引用”
- 专访美满科技CEO:用技术和创新让客户服务更简单
- Android开发做一个简单的音乐播放器
- oracle listagg如何去重
- python--inspect模块