JDBC复习--数据库事务
发布日期:2022-02-10 08:11:16
浏览次数:19
分类:技术文章
本文共 3109 字,大约阅读时间需要 10 分钟。
此博客仅为本人学习JDBC时所做记录。
08-数据库事务
8.1 事务
一组逻辑操作单元,使数据从一种状态变换到另一种状态。
一组逻辑操作单元,一个或多个DML操作
8.2 事务处理的原则
保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
说明:
数据一旦提交,就不回滚
哪些操作会导致数据的自动提交
- DDL操作一旦执行,都会自动提交
- set autocommit =false 对DDL操作失效
- DML默认情况下,一旦执行,就会自动提交
- 我们可以通过set autocommit = false 的方式取消DML操作的自动提交
- 默认在关闭连接时,会自动提交数据
8.3 代码的体现
@Test public void testUpdateWithTx() { Connection conn = null; try { conn = JDBCUtils.getConnection(); System.out.println(conn.getAutoCommit());// 取消数据的自动提交 conn.setAutoCommit(false); String sql1 = "update user_table set balance = balance-100 where user = ?"; update(conn,sql1,"AA");// 模拟网络异常 System.out.println(10/0); String sql2 = "update user_table set balance = balance+100 where user = ?"; update(sql2,"BB"); System.out.println("转账成功");// 提交数据 conn.commit(); } catch (Exception e) { e.printStackTrace();// 回滚 try { conn.rollback(); } catch (SQLException throwables) { throwables.printStackTrace(); } } finally { //修改为自动提交数据 //主要针对于使用数据库连接池的使用 try { conn.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); } JDBCUtils.closeResource(conn,null); } }
8.4 通用的增删改操作(考虑事务)
//通用的增删改操作 ----version2.0public int update(Connection conn,String sql,Object ...args){ //sql中占位符的个数应该与可变形参args的个数一致 PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i=0;i
8.5 通用的查询(考虑事务)
//通用的查询操作,用于返回数据表中的一条记录(version 2.0:考虑上事务) publicT getInstance(Connection conn,Class clazz,String sql,Object ...args) { PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); for (int i=0;i
8.6事务中必须知道的几点
8.6.1 四大属性(ACID)
-
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 -
一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 -
隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 -
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。多余的小知识:
BAT:百度、阿里、腾讯
BBA:奔驰、宝马、奥迪
TMD:头条、美团、滴滴
8.6.2 数据操作过程中可能出现的问题(针对隔离性)
- 脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段。之后, 若 T2 回滚, T1读取的内容就是临时且无效的。
- 不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段。之后, T1再次读取同一个字段, 值就不同了。
- 幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行。之后, 如果 T1 再次读取同一个表, 就会多出几行。
8.6.3 数据库中的四种隔离级别
一致性和并发性:一致性越好,并发性越差。
-
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED 。
-
Mysql 支持 4 种事务隔离级别。Mysql 默认的事务隔离级别为: REPEATABLE READ。
8.6.4 如何查看并设置隔离级别
-
查看当前的隔离级别:
SELECT @@tx_isolation;
-
设置当前 mySQL 连接的隔离级别:
set transaction isolation level read committed;
-
设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed;
转载地址:https://blog.csdn.net/qq_45717064/article/details/111465735 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月20日 07时18分59秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【Leetcode刷题篇】leetcode538 把二叉搜索树转换为累加树
2019-04-26
【多线程与高并发】线程的优先级是怎么回事?
2019-04-26
【多线程与高并发】Java守护线程是什么?什么是Java的守护线程?
2019-04-26
【Leetcode刷题篇/面试篇】-前缀树(Trie)
2019-04-26
【Leetcode刷题篇】leetcode337 打家劫舍III
2019-04-26
【Leetcode刷题篇】leetcode4 寻找两个正序数组的中位数
2019-04-26
【Leetcode刷题篇】leetcode316 去除重复字母
2019-04-26
【Leetcode刷题篇】leetcode1081 不同字符的最小子序列
2019-04-26
【面试篇】Java网络编程与IO流体系
2019-04-26
【大话Mysql面试】-Mysql的索引为什么要使用B+树,而不是B树,红黑树等之类?
2019-04-26
【大话Mysql面试】-如何通俗易懂的了解Mysql的索引最左前缀匹配原则
2019-04-26
【大话Mysql面试】-MYSQL的两种存储引擎MyISAM与InnoDB的区别是什么?
2019-04-26
理解String.intern()和String类常量池疑难解析例子
2019-04-26
python flask打造前后端分离的口罩检测
2019-04-26
【大话Mysql面试】-MySQL基础知识
2019-04-26
【大话Mysql面试】-MySQL数据类型有哪些
2019-04-26
【大话Mysql面试】-MySQL数据引擎
2019-04-26
【大话Mysql面试】-常见SQL语句书写
2019-04-26