概述
事务
一.事务的基本介绍
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;
- 事务案例
- 查看事务的默认提交方式L
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:密码
- 注册驱动:告诉程序该使用哪一个数据库驱动jar
2 Connection:数据库连接对象
- 1 功能
- 获取执行sql 的对象
- Statement createStatement()
- PreparedStatement prepareStatement(String sql)
- 管理事务:
- 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
- 提交事务:commit()
- 回滚事务:rollback()
- 获取执行sql 的对象
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()
-
参数:
- int:代表列的编号,从1开始 如: getString(1)
- 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'
- 输入用户随便,输入密码:a’ or ‘a’ = 'a
- 解决sql注入问题:使用PreparedStatement对象来解决
- 预编译的SQL:参数使用?作为占位符
JDBC控制事务
- 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
- 操作:
1. 开启事务
2. 提交事务
3. 回滚事务 - 使用Connection对象来管理事务
- 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
- 在执行sql之前开启事务
- 提交事务:commit()
- 当所有sql都执行完提交事务
- 回滚事务:rollback()
- 在catch中回滚事务
- 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
最后
以上就是矮小冰淇淋为你收集整理的Mysql事务与JDBC事务的全部内容,希望文章能够帮你解决Mysql事务与JDBC事务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复