JDBC(六)—— 数据库事务
数据库事务
事务
一组逻辑操作单元,使数据从一种状态变换到另一种状态
事务处理
保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,要么所有事务都提交,要么数据库管理系统放弃所有修改,整个事务回宫到最初状态。
数据一旦提交就不可回滚
DDL操作执行自动提交
DML默认情况下一旦执行,自动提交。可通过set autocommit = false的方式取消DML操作的自动提交
关闭连接时会自动提交
支持事物的增删改操作
/**
- 支持事务的增删改操作
- @param conn
- @param sql
- @param args
*/
public void update(Connection conn,String sql,Object ...args){
PreparedStatement ps = null;
try {
//2.预编译sql语句,返回preparedStatement实例
ps = conn.prepareStatement(sql);
//3.填充占位符
//sql占位符的个数与可变形参的长度相同,可变形参相当于一个数组
for (int i = 0; i < args.length ; i++) {
ps.setObject(i+1,args[i]);
}
//4.执行
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.资源关闭
JdbcUtils.closeResource(null,ps);
}
}
使用
public void testTransaction() {
Connection conn = null;
try {
String sql1 = "update transaction set money = money - 100 where name = ?";
String sql2 = "update transaction set money = money + 100 where name = ?";
CommonUtils commonUtils = new CommonUtils();
conn = JdbcUtils.getConnection();
//取消数据的自动提交功能
conn.setAutoCommit(false);
commonUtils.update(conn,sql1,"why");
commonUtils.update(conn,sql2,"wyy");
System.out.println("转账成功");
//提交数据
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
//回滚数据
conn.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} finally {
JdbcUtils.closeResource(conn,null);
}
}
事务的ACID属性及四种隔离级别
ACID属性
原子性(Atomicity):指事务是不可分割的单位
一致性(Consistency):事务必须使数据库从一个一致性转移到另一个一致性状态
隔离性(Isolation):指一个事务的执行不能被其他事务干扰,一个事务内部的操作及使用的数据对并发的其他事务是隔离的
持久性(Durability):指事务一旦被提交,对数据库的改变即为永久性的
数据库并发问题
脏读
事务T1,T2
T1读取了已经被T2更新但是没有提交的字段
T2回滚,T1读取的内容无效
不可重复读
事务T1,T2
T1读取了一个字段,然后T2更新了该字段.
之后T1再次读取同一字段,值不同
幻读
事务T1,T2
T1读取了这个表中的某些字段,T2插入了数据
T1再次相同表的同一字段 增加了几行
四种隔离级别
READ UNCOMMITED(读未提交数据)
允许事务读取未被其他事务提交的变更.
问题:脏读,不可重复读,幻读
READ COMMITED(读已提交数据)
只允许事务读取已经被其他事务提交的变更,避免脏读.
问题:不可重复的,幻读
REPEATABLE READ(可重复读)
雀稗史无可多次从一个字段中读取相同的值,在此期间,禁止其他事务对这个字段进行更新.
问题:幻读
SERIALIZABLE(串行化)
确保十五从一个表读取相同的行,在此期间,禁止其他事务对该表进行更新操作,所有并发问题都可避免,但是性能低下.
注:
Oracle数据库支持2种事务隔离:READ UNCOMMITED(读未提交数据)和SERIALIZABLE(串行化),默认为READ UNCOMMITED(读未提交数据)
Mysql 支持4种事务隔离,默认:REPEATABLE READ(可重复读)
在MySQL用命令行设置隔离级别
Mysql常用命令
进入mysql
命令行输入:mysql -u用户名 -p密码
修改密码
mysqladmin -u用户名 -p旧密码 password 新密码
添加新用户并赋予相应权限
grant select on 数据库.* to 用户名@登录主机 identified by “密码”
显示所有数据库
show databases
删除数据库
drop database <数据库名>
设置隔离级别
设置当前连接的隔离级别
set transaction isolation level read committed;
设置全局隔离级别
set global transaction isolation level read committed;
Java代码设置隔离级别
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
public void testSelect() throws Exception {
Connection conn = JdbcUtils.getConnection();
//获取当前隔离级别
System.out.println(conn.getTransactionIsolation());
//取消自动提交数据
conn.setAutoCommit(false);
//设置数据库隔离级别
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
String sql = "select username,password,reg_date regDate from user where username = ?";
User user = commonUtils.queryForDifference(conn, User.class, sql, "why");
System.out.println(user);
}
@Test
public void testUpdae() throws Exception {
Connection conn = JdbcUtils.getConnection();
//取消自动提交
conn.setAutoCommit(false);
String sql = "update user set username = ? where username = ?";
commonUtils.update(conn,sql,"love","why");
Thread.sleep(15000);
System.out.println("修改结束");
}
JDBC(六)—— 数据库事务的更多相关文章
- JDBC(3)-数据库事务
一.环境搭建(复习) 首先建立lib目录然后要把对应的jar包导进来 然后就是jdbc.properties文件 user=root password=123456 url=jdbc:mysql:// ...
- 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务
一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...
- JDBC事务和数据库事务嵌套的讨论 .
首先必须执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,否则手动提交con.commit()无效,手动回滚con.rollback()引发SQLExceptio ...
- 使用JDBC进行数据库的事务操作(2)
本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...
- 使用JDBC进行数据库的事务操作(1)
本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...
- JDBC基础学习(四)—数据库事务
一.事务基本认识 1.事务的概述 为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...
- 数据库事务的四大特性以及4种事务的隔离级别-以及对应的5种JDBC事务隔离级别
本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...
- Jdbc执行存储过程报数据库事务无法执行的异常
Jdbc执行存储过程报数据库事务无法执行的异常 环境: Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012 问题: 一个小 ...
- Java操作数据库——在JDBC里使用事务
Java操作数据库——在JDBC里使用事务 摘要:本文主要学习了如何在JDBC里使用事务. 使用Connection的事务控制方法 当JDBC程序向数据库获得一个Connection对象时,默认情况下 ...
随机推荐
- python 子进程
1.线程的介绍(理论部分) 1.1 进程线程分工 我们之前讲运行一个py文件,就是开启了一个进程,在内存中开辟一个进程空间,将必要的数据加载到这个进程空间,然后cpu在去调用这个进程的主线程去执行具体 ...
- 口述完SpringMVC执行流程,面试官就让同事回家等消息了
Srping MVC 执行流程真的是老生常谈的话题了,最近同事小刚出去面试,前面面试官相继问了几个 Spring 相关的问题,但当面试官问他,你知道 Srping MVC 的执行流程吗?小刚娴熟的巴拉 ...
- 分享篇:聊一聊 15.5K 的 FileSaver,是如何工作的?
聊一聊 15.5K 的 FileSaver,是如何工作的? FileSaver.js 是在客户端保存文件的解决方案,非常适合在客户端上生成文件的 Web 应用程序.它简单易用且兼容大多数浏览器,被作为 ...
- Qt中,将以png为格式的图片在按钮控件上显示
在Qt编程中,我们常常会遇见这样或那样的小问题,这里,我介绍一个将png为格式的图片在按钮控件上显示的小功能. resistanceBtn = new QPushButton(element); re ...
- 第15.3节 PyCharm程序调试功能介绍
一. 代码调试 点击工具栏的调试按钮(如下图蓝色圈标记按钮)可以进行程序调试,可以在调试前先设置断点,断点设置就是在打开文件的行与前面的行号之间用鼠标单击进行设置和取消(如下图蓝色下划线上面的实体圆点 ...
- 第 7篇 Scrum 冲刺博客
一.站立式会议 1.站立式会议照片 2.昨天已完成的工作 对职工的查询 3.今天计划完成的工作 继续与同学对接,争取早日完成项目的整个流程 初步对数据库筛选 4.工作中遇到的困难 ①有同学不知道如何远 ...
- WC.exe(基于Java实现)
一.github地址 https://github.com/Mazin-hub/MyWC.exe.git 二.PSP表格 PSP2.1 Personal Software Process Stage ...
- STL——容器(List)list 的反序排列
list.reverse(); //反转链表,比如list包含1, 2, 3, 4, 5五个元素,运行此方法后,list就包含5, 4, 3, 2, 1元素. 1 #include <iostr ...
- Java-静态关键字Static&静态代码块
静态成员变量:(static修饰变量) 如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类.多个对象共享同一份数据. 静态方法:(static修饰方法) 一旦使用 ...
- Object not found! The requested URL was not found on this server.... 报错解决方案
服务器(centos6.5) lnmp 报错如下 Object not found! The requested URL was not found on this server. The link ...