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对象时,默认情况下 ...
随机推荐
- springmvc<三> 异常解析链与视图解析链
1.1.7. Exceptions - 如果异常被Controller抛出,则DispatchServlet委托异常解析链来处理异常并提供处理方案(通常是一个错误的响应) spri ...
- Python中的"缝合器"zip函数:将多个可迭代对象组合成一个迭代器
zip函数将参数中多个可迭代对象中相同序号的元素取出组合成一个元组作为输出列表的一个同样序号的元素,即输出列表的每个元素是一个元组,该元组的元素来源于参数中每个迭代对象的对应序号的元素. 具体可参考: ...
- PyQt(Python+Qt)学习随笔:QTableWidgetItem项的复选状态checkState访问方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件中的QTableWidgetItem项可以单独设置复选状态,如图所有 ...
- Android的intent
title: Android基础01 date: 2020-02-15 17:17:04 tags: 1.Intent Intent可以让活动进行跳转.使用方式有两种,一种是显式,另一种是隐式. 1. ...
- Thinkphp V5.X 远程代码执行漏洞 - POC(搬运)
文章来源:lsh4ck's Blog 原文链接: https://www.77169.com/html/237165.html Thinkphp 5.0.22 http://192.168.1.1 ...
- Python3安装且环境配置(三)
1.在Window 平台安装 Python3 以下为在 Window 平台上安装 Python3 的简单步骤: 打开WEB浏览器访问http://www.python.org/download/ 在下 ...
- jupyterlab 增加新内核的方法ipykernel
参考: https://blog.csdn.net/C_chuxin/article/details/82690830
- LeetCode初级算法之数组:136 只出现一次的元素
只出现一次的元素 题目地址:https://leetcode-cn.com/problems/single-number/ 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找 ...
- 《Eroico》关卡与操作设计
操作设计: 没有给明操作教程,操作全靠蒙,只有改建的位置可以看到. 但游戏的难度并没有给玩家适应操作感,随着难度提升怪物血量增厚,但怪物并没有僵直英雄却有僵直.第一个小猫妖便给了玩家一个痛击. 方向键 ...
- 我对js数据类型的理解和深浅(copy)的应用场景
本人毕业一所专科院校,所学专业是计算机应用技术,在大学时对前端有了一定的了解之后,觉得自己对前端的兴趣十分强烈,开始自学前端,一路上也是坎坎坷坷,也有想要放弃的时候,还好坚持了下来,并且从事前端开发已 ...