数据库事务

事务

一组逻辑操作单元,使数据从一种状态变换到另一种状态

事务处理

保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。

当在一个事务中执行多个操作时,要么所有事务都提交,要么数据库管理系统放弃所有修改,整个事务回宫到最初状态。

数据一旦提交就不可回滚

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(六)—— 数据库事务的更多相关文章

  1. JDBC(3)-数据库事务

    一.环境搭建(复习) 首先建立lib目录然后要把对应的jar包导进来 然后就是jdbc.properties文件 user=root password=123456 url=jdbc:mysql:// ...

  2. 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务

    一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...

  3. JDBC事务和数据库事务嵌套的讨论 .

    首先必须执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,否则手动提交con.commit()无效,手动回滚con.rollback()引发SQLExceptio ...

  4. 使用JDBC进行数据库的事务操作(2)

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

  5. 使用JDBC进行数据库的事务操作(1)

    本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...

  6. JDBC基础学习(四)—数据库事务

    一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...

  7. 数据库事务的四大特性以及4种事务的隔离级别-以及对应的5种JDBC事务隔离级别

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

  8. Jdbc执行存储过程报数据库事务无法执行的异常

    Jdbc执行存储过程报数据库事务无法执行的异常 环境: Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012 问题: 一个小 ...

  9. Java操作数据库——在JDBC里使用事务

    Java操作数据库——在JDBC里使用事务 摘要:本文主要学习了如何在JDBC里使用事务. 使用Connection的事务控制方法 当JDBC程序向数据库获得一个Connection对象时,默认情况下 ...

随机推荐

  1. 【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器

    [GDOI2014模拟]JZOJ2020年8月14日提高组 服务器 题目 Time and Memory Limits Description 我们需要将一个文件复制到n个服务器上,这些服务器的编号为 ...

  2. 转:Chrome浏览器查看网站登录 Cookie 信息的方法

    当我们使用自动签到等程序的时候一般都要用到网站Cookie,我们可以借助浏览器的扩展来获取Cookie信息,但其实通过浏览器本身的功能就可以查看Cookie信息.以Chrome类浏览器为例有以下三种方 ...

  3. flask实现分类搜索的小测试

    最新学长要求实现一个搜索的功能呢,也费了一点功夫.这个案例也没有学长写的好,比学长的实现差了不少,待我仔细研究习再发出相应代码 项目要求,搜索语法如下: titile: xxx #搜索titile的所 ...

  4. JDBC(一)—— JDBC概述

    Jdbc概述 Java DataBase connectivity(Java语言连接数据库) Jdbc本质是什么? 是Sun公司制定的一套接口,java.sql.* 接口都有调用者和实现者 面向接口调 ...

  5. 关于Android手机CPU不同架构的问题

    1.共有7种架构 armeabiv-v7a: 第7代及以上的 ARM 处理器.2011年15月以后的生产的大部分Android设备都使用它. arm64-v8a: 第8代.64位ARM处理器,很少设备 ...

  6. 120多套各种类别微信小程序模板源码打包下载

    120多套各种类别微信小程序模板源码打包下载,以下是部分截图欢迎下载!120多套各种类别微信小程序模板源码打包下载 下载地址:https://pan.baidu.com/s/1Cfqyc9p2ZDOc ...

  7. sql注入之双查询注入

    双查询注入前需要了解什么是子查询 子查询可以理解在一个select语句中再插入一个select 里面的select语句就是子查询 例子:select concat((select database() ...

  8. ThreadX——IPC应用之信号量

    一.应用简介 在RTOS的应用开发中,信号量也是经常使用到的一种用于多任务之间信息同步.资源互斥访问的一种手段,常用于协调多个任务访问同一资源的场景.信号量又分为计数信号量和互斥信号量.计数信号量可以 ...

  9. Python定时任务利器—Apscheduler

    导语 在工作场景遇到了这么一个场景,就是需要定期去执行一个缓存接口,用于同步设备配置.首先想到的就是Linux上的crontab,可以定期,或者间隔一段时间去执行任务.但是如果你想要把这个定时任务作为 ...

  10. 解决python3 ,ModuleNotFoundError: No module named 'pip'问题

    今天想要装一下PyYmal第三方库来写一下Python的desired_caps.yaml文件,候发现cmd窗口下无法执行pip命令, 出现了:ModuleNotFoundError: No modu ...