MySQL 事务入门案例
概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全成功,要么全不成功。
从例子说起
待处理数据表之前
先不使用事务,代码如下.
import com.mchange.v2.c3p0.ComboPooledDataSourceobject MysqlDemo extends App {private val source = new ComboPooledDataSource()private val connection: Connection = source.getConnection()//connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ)try {//connection.setAutoCommit(false)val ps: PreparedStatement = connection.prepareStatement("update emp set sal=sal+100 where empno='7369'")ps.executeUpdate()val i = 10 / 0val ps1: PreparedStatement = connection.prepareStatement("update emp set sal=sal+100 where empno='7499'")ps1.executeUpdate()//connection.commit()} catch {case exception: Exception => {exception.printStackTrace()//connection.rollback()}}connection.close()
}
执行后结果如下,其中一条指令执行,另一条没有执行. 不符合事务要求,
现在去掉代码中注释掉的事务语句,重新执行,结果不变,说明事务成功,遇到错误时启动了回滚.
object MysqlDemo extends App {//创建连接池private val source = new ComboPooledDataSource()//从连接池中获取一个连接private val connection: Connection = source.getConnection()
//设置隔离级别
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ)try {//设置自动提交为falseconnection.setAutoCommit(false)val ps: PreparedStatement = connection.prepareStatement("update emp set sal=sal+100 where empno='7369'")//执行更新数据ps.executeUpdate()//创造错误val i = 10 / 0//再次执行sql语句val ps1: PreparedStatement = connection.prepareStatement("update emp set sal=sal+100 where empno='7499'")ps1.executeUpdate()//提交事务connection.commit()} catch {case exception: Exception => {exception.printStackTrace()//发生异常时进行回滚connection.rollback()}}connection.close()
}
注释掉
val i = 10 / 0
再次执行全部成功
也就是验证事务的全部成功,要么全部失败的特性.
jdbc中的事务
这个是在代码中事务的应用方式
Connection的三个方法与事务有关:
setAutoCommit(boolean)
:设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么相当于开启了事务了;con.setAutoCommit(false) 表示开启事务。
commit()
:提交结束事务。
rollback()
:回滚结束事务。
Mysql中的事务
这个是在mysql查询界面用的,不是在代码中用的!
a、mysql引擎是支持事务的
b、mysql默认自动提交事务。每条语句都处在单独的事务中。
c、手动控制事务命令如下
开启事务:start transaction | begin
提交事务:commit
回滚事务:rollback事务开始于
• 连接到数据库上,并执行一条DML语句insert、update或delete
• 前一个事务结束后,又输入了另一条DML语句事务结束于
• 执行commit或rollback语句。
• 执行一条DDL语句,例如create table语句,在这种情况下,会自动执行commit语句。
• 执行一条DDL语句,例如grant语句,在这种情况下,会自动执行commit。
• 断开与数据库的连接
• 执行了一条DML语句,该语句却失败了,在这种情况中,会为这个无效的DML语句执行rollback语句。
事务的特性
原子性
指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
一致性
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
隔离性
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
持久性
指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误
PS:
以上代码需要导入C3P0以及mysql驱动
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.0.8</version></dependency><!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --><!-- https://mvnrepository.com/artifact/c3p0/c3p0 --><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency>
另外,C3P0的配置文件要放在工程的resource目录下.
MySQL 事务入门案例相关推荐
- [MySQL光速入门]020 事务
TCL 事务控制语言 SQL的四种语言 DDL(Data Definition Language)数据库定义语言 建表, 建库, 修改表结构 DML(Data Manipulation Languag ...
- 【数据分析】【MySQL】快速入门+案例+代码+命令整理+GIF实操演示
1.SQL的语句顺序(理论) SELECT [ALL|DISTINCT] <目标表达式>.... FROM <表名或者视图名>.. [WHERE <条件表达式>] ...
- 最全MySQL8.0实战教程 14 MySQL的存储过程 14.2 入门案例
最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 14 MySQL的存储过程 14.2 入门案例 14.2.1 格式 14.2.2 操作 - 数据准备 14.2.3 操作 - 创建 ...
- 献给入门小白的MySQL学习笔记+案例
MySQL学习笔记 目录 MySQL学习笔记 1.SQL概述 1.1:数据库的好处 1.2:数据库管理系统 1.3:SQL语言概述 1.4:SQL语言的分类 2.安装与使用 2.1:MySql数据库产 ...
- (spingboot入门案例)SpingBoot整合mybatis(mySql)
仅供参考 目录结构: 环境: idea,mysql(8.0.29) 1.新建项目 1. 2.Project SDK选择自己对应的java版本 url选第二个,使用阿里的镜像:http://start. ...
- mysql 事务 注意 优化_MySQL入门详解——事务、锁、优化
MySQL事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在一个商城系统中,用户执行购买操作,那么用户订单中应该加一条,库存要减一条,如果这两步由于意外只进行了其中一步那么就会发生 ...
- mysql 事务 注意 优化_MySQL入门详解(二)---mysql事务、锁、以及优化
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在一个商城系统中,用户执行购买操作,那么用户订单中应该加一条,库存要减一条,如果这两步由于意外只进行了其中一步那么就会发生很大的问题.而事 ...
- mybatis基于注解的入门案例
mybatis基于注解的入门案例: 把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时需要在SqlMa ...
- idea springmvc_IDEA搭建SSM(spring+springmvc+mybatis)Maven项目的入门案例
上一篇文章已经搭建好了SSM的框架,并且启动成功,今天来编写一下入门案例. 文章的主要内容: 1.hello world的编写 2.引入log4j,在控制台打印sql 3.增删改查的编写 一.在mys ...
最新文章
- BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
- asp.net form submit 在Chrome里面看Form提交
- Ueditor1.4.3上传视频IE下无法播放的问题
- CES 2021线上大会前瞻、Roblox 估值近300亿美元、联想将推出企业级 AR 眼镜等|Decode the Week...
- docker容器状态跟踪及疑惑
- mysql 5.7 io 性能 aio_深入理解MySQL的InnoDB引擎
- WORD如何缩小编号与文本之间的距离?
- Java枚举介绍_java枚举使用详细介绍及实现
- yolov2 - tiny模型训练识别
- IT成长中的龟兔赛跑
- 华沙理工大学语言c1,留学波兰华沙理工大学:一个让人轻易就爱上的地方
- 用户输入一个列表和两个整数作为下标,然后使用切片获取并输出列表中结余两个下标之间的元素组成的子列表。例如,用户输入 [1,2,3,4,5,6]和2,5,程序输出[3,4,5]。
- 腾讯广告设计大赛初探
- RabbitMQ实战指南之RabbitMQ架构及运转流程
- 【Servlet】servlet上传文件
- 学习整理自用——计算机基础路径
- 信号满格无去连接服务器,小米10信号满格但是没网络
- SWAT模型 | 运行Arcswat报错问题及解决办法 | forrt1:error(65): floating invalid解决方法
- win10为知笔记启动程序无反应
- [软件分享]速盘,一个新的百度网盘下载工具