我是靠谱客的博主 矮小冰淇淋,最近开发中收集的这篇文章主要介绍Mysql事务与JDBC事务,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

事务

一.事务的基本介绍

1.概念

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功,同时失败。
  • 事务用来管理 insert,update,delete 语句。
  • 为什么需要事务呢?
    • 假设银行现在要完成一个转账,张三要给李四转100元,那么流程就是(1)先看A是否有100.(2)张三余额减100(3)李四余额多一百 。这三步要么都成功,要么都失败。假如没有事务,(2)成功其他失败,那么张三是不是就亏损了100?所以事务重要性不言而喻。

2.Mysql中事务

  • 事务提交的两种方式;
    • 自动提交
      • Mysql自动提交事务
      • 一条DML(增删改)语句会自动提交一次事务
    • 手动提交
      • 需要先开启事务,在提交。
  • 修改事务的默认提交方式
    • 查看事务的默认提交方式L select @autocommit;
      1 代表自动提交,0代表手动提交
    • 修改默认提交方式: set autocommit=0;
      • 事务案例
create table account(
				id int primary key  auto_increment,
				name varchar(10) not null,
				balance double
			);
			## 添加测试数据
			insert into account(name,balance)
				values('tom',1000),
					('lily',1000);
			##1. 开启事务
			start transaction;
			##2. tom账户-500
			update account set balance =balance-500 where id = 1;
			##3. lily账户+500
			出错啦.......
			update account set balance = balance+500 where id=2;
			## 发现执行没有问题,提交事务
			commit;
			## 若发现出现问题,回滚事务
			rollback;

3.事务的四大特征

  • ACID Atomic(原子性):是不可分割的最小操作单位,要么同时成功,要么同时失败。
  • Durability(持久性):当事务提交或回滚后,数据库会持久化的保存数据。
  • Isolation(隔离性):多个事务之间相互独立。
  • Consistency(一致性):事务操作前后,数据总量不变。

4.事务的隔离级别

  • 概念多个事务之间是隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
  • 存在问题:
    (1) 脏读:一个事务,读取到另外一个事务中没有提交的数据。
    (2) 不可重复读(虚读):在同一事务中,两次读取到的数据不一样。
    (3) 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
  • 隔离级别:
    (1) read uncommitted:读未提交
    产生的问题:脏读、不可重复读、幻读
    (2) read committed:读已提交(Oracle 默认)
    产生的问题:不可重复读、幻读
    (3) repeatable read:可重复读(MySQL 默认)
    产生的问题:幻读
    (4)serializable :串行化
    可以解决所有的问题
  • 注意:隔离级别从小到大安全性越来越高,但是效率越来越低

JDBC

1.概念

  • Java DataBase Connectivity : Java 数据库连接, Java语言操作数据库
  • JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

2.快速使用

  • 步骤:
    • 1 导入驱动jar包
    • 2 注册驱动
      Class.forName("com.mysql.cj,jdbc.Driver");
    • 3 获取数据库连接对象
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/"数据库名字", "root", "密码");
    • 4 定义sql语句
      String sql = "update account set balance = 500 where id = 1;
    • 5 获取执行sql的对象 Statement
      Statement stmt = conn.createStatement();
    • 6 执行sql
      stmt.executeUpdate(sql);
    • 7 处理结果
    • 8 释放资源

3.详解各个对象

1 DriverManager:驱动管理对象

  • 功能
    • 注册驱动:告诉程序该使用哪一个数据库驱动jar
      注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
    • 获取数据库连接:
      • 方法:static Connection getConnection(String url, String user, String password)
      • 参数:
      • url:指定连接的路径
        • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
        • 例子:jdbc:mysql://localhost:3306/db3
        • 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
      • user:用户名
      • password:密码

2 Connection:数据库连接对象

  • 1 功能
    • 获取执行sql 的对象
      • Statement createStatement()
      • PreparedStatement prepareStatement(String sql)
    • 管理事务:
      • 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
      • 提交事务:commit()
      • 回滚事务:rollback()

3 Statement:执行sql对象

  • 执行sql
    • boolean execute(String sql) :可以执行任意的sql 了解
    • int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
      • 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
    • ResultSet executeQuery(String sql) :执行DQL(select)语句

4. ResultSet:结果集对象,封装查询结果

  • boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
  • getXxx(参数):获取数据
    • Xxx:代表数据类型 如: int getInt() , String getString()

    • 参数:

      1. int:代表列的编号,从1开始 如: getString(1)
      2. String:代表列名称。 如: getDouble(“balance”)
    • 使用步骤:
      1. 游标向下移动一行
      2. 判断是否有数据
      3. 获取数据

5.PreparedStatement:执行sql的对象

  • SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
    • 输入用户随便,输入密码:a’ or ‘a’ = 'a
      sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
  • 解决sql注入问题:使用PreparedStatement对象来解决
  • 预编译的SQL:参数使用?作为占位符

JDBC控制事务

  • 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
  • 操作:
    1. 开启事务
    2. 提交事务
    3. 回滚事务
  • 使用Connection对象来管理事务
    • 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
      • 在执行sql之前开启事务
    • 提交事务:commit()
      • 当所有sql都执行完提交事务
    • 回滚事务:rollback()
      • 在catch中回滚事务

最后

以上就是矮小冰淇淋为你收集整理的Mysql事务与JDBC事务的全部内容,希望文章能够帮你解决Mysql事务与JDBC事务所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部