MySQL数据库(六)—— 事务

一、事务的基本特征

1. 概念:如果一个包含多个步骤的业务操作,被事务管理,这些操作要么同时成功,要么同时失败。

事务执行是一个整体,所有的SQL语句都必须执行成功。如果其中有一条SQL语句出现异常,则所有的SQL语句都要回滚,整个业务执行失败。

2. 操作:

(1) 开启事务:start transaction

(2) 回滚:rollback

(3) 提交:commit

3.MySQL数据库中事务默认自动提交

事务提交的两种方式:

第一种方式:自动提交

MySQL就是自动提交的。

一条DML语句会自动提交一次事务。

第二种方式:手动提交

Oracle数据库默认是手动提交事务的。

需要先开启事务,在提交。

4.修改事务的默认提交方式:

查看事务的默认提交方式:

SQL语句:select @@autocommit;

结果:1代表自动提交;0代表手动提交

修改事务默认提交方式SQL语句为:set @@autocommit = 0;

这时写了DML语句,不写commit是不会生效的。

二、事务的四大特征(ACID)

原子性(Atomicity):事务是一个不可分割的最小单元,要么全部成功提交,要么全部失败回滚。失败回滚的事务,将不能对事物有任何影响。

一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

详解:

数据库状态如何变化?每一次数据变更就会导致数据库的状态迁移。如果数据库的初始状态是C0,第一次事务T1的提交就会导致系统生成一个SYSTEM CHANGE NUMBER(SCN),这时数据库状态由C0转变成C1。执行第二个事务T2的时候数据库状态由C1转变成C2,以此类推,执行第N个事务Tn的时候,数据库状态由C(n-1)变成Cn。

一致性可以从一致性读和一致性写两个方面来理解。

一致性读:事务读取数据只能从一个状态中读,不能从2个或2个以上状态读取。也就是说T(n)只能从C(n-1),C(n-2)...C1中的一个状态读取数据,不能一部分数据来自C(n-1),另一部分数据来自C(n-2)。

一致性写:事务执行的数据变更只能基于上一个一致的状态,且只能体现在一个状态中。T(n)的变更结果只能基于C(n-1),C(n-2)...C1状态,且只能体现在C(n)状态中。也就是说,一个状态只能有一个事务变更数据,不允许有2个或者2个以上事务在一个状态中变更数据。至于具体一致写基于哪个状态,需要判断T(n)事务是否和T(n-1),T(n-2),...T(1)有依赖关系。

隔离性(Isolation):隔离性是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其它事务所做的操作干扰,多个并发事务之间,应当相互隔离。

例如同时有T1和T2两个并发事务,从T1角度来看,T2要不在T1执行之前就已经结束,要不在T1完成之后才开始。将多个事务隔离开,每个事务都不能访问到其它事务操作过程中的状态。

持久性(Durability):持久性是指事务的操作,一旦提交或回滚,对于数据库中数据的改变是永久的,即使数据库发生故障,也不能丢失已提交事务所完成的改变,数据库表的数据会持久更新。

三、事务的隔离级别

1.概念:多个事务之间应该是隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置 不同的隔离级别就可以解决这些问题。

2.存在的问题:

脏读:一个事务,读取到另一个事务中没有提交的数据。

不可重复读(虚读):在同一个事务中,两次读取到的数据不一致。

幻读:一个事务操作(DML)数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。

3.隔离级别:

(1) Read Uncommitted 读未提交

  产生的问题:脏读、不可重复读、幻读

(2) Read Committed 读已提交

  产生的问题:不可重复读、幻读

(3) Repeatable Read 可重复读

  产生的问题:幻读

(4) Serializable 串行化

  可以解决所有问题

注意:隔离级别从小到大安全性越来越高,但是效率越来越低。既保证相对安全,又保证效率相对高。

4.SQL语句

(1) 数据库查询隔离级别

select @@tx_isolation

(2) 数据库设置隔离级别

set global transation isolation level 级别字符串; -- 把当前连接关掉,重新打开一个窗口,才会生效。

原文地址:https://www.cnblogs.com/upyang/p/12184944.html

时间: 2024-10-11 01:47:17

MySQL数据库(六)—— 事务的相关文章

MySQL数据库的事务管理

当前在开发ERP系统,使用到的数据库为Mysql.下面介绍下如何开启事务,以及事务隔离的机制 : 1. 检查当前数据库使用的存储引擎. show engines; 2. 修改前my.ini中的文件如下: 3. 修改my.ini的文件如下. 3.1 修改了默认的存储引擎 3.2 增加了mysql数据库的事务隔离级别, 如果不添加默认是REPEATABLE-READ. 4. 只需要重启mysql的服务即可. net stop mysql net start mysql 5. 再次查询show eng

Mysql数据库无法使用事务回滚

package jdbc02; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.junit.Test; import jdbc02.*; public class TransactionTest { /**  * Tom 给Jerry 汇款500元  *   * 关于事务:  * 1. 如果多个操作,每个操作使用的是自己的单独的连接,则无

记录一次Spring boot 搭建框架连接Mysql数据库注解事务不回滚的故障

搭建了一个新框架,使用了spring boot 替换以简化原来繁杂的spring配置,使用Spring注解管理事务,持久层使用mybatis. 连接mysql数据库完成项目的过程中发现不支持事务,因为用的新框架自己本身也不是很了解,刚开始一直以为是自己的框架搭建的有问题, 后来发现是mysql数据库引擎的问题 解决方案 MyISAM不支持事物,InnoDB支持事物 先检查你的mysql版本 ,mysql 4.0系列之前是不支持事务的.    SELECT VERSION(); 检查你的数据库支持

django中怎么使用mysql数据库的事务

Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败. Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交.我们需要在保存数据库操作中自己控制数据库事务的执行流程. 在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用法: 装饰器用法 from django.db import transaction

Mysql数据库分布式事务XA详解

XA事务简介 XA 事务的基础是两阶段提交协议.需要有一个事务协调者来保证所有的事务参与者都完成了准备工作(第一阶段).如果协调者收到所有参与者都准备好的消息,就会通知所有的事务都可以提交了(第二阶段).MySQL 在这个XA事务中扮演的是参与者的角色,而不是协调者(事务管理器). mysql 的XA事务分为内部XA和外部XA. 外部XA可以参与到外部的分布式事务中,需要应用层介入作为协调者:内部XA事务用于同一实例下跨多引擎事务,由Binlog作为协调者,比如在一个存储引擎提交时,需要将提交信

MySQL数据库(六)

##################################### MySQL数据库主从同步 主从同步: 让其他数据库服务器自动同步正在提供服务的数据库服务器上的数据. 构建主从同步 (a)确保主.从数据库的数据相同 从库必须要有主库上的数据 (b)配置主服务器 启用binlog日志,server_id,授权用户 (c)配置从服务器 设置server_id [master] /etc/my.cnf [mysqld] server_id=11 log-bin=master11 binlog

MySQL数据库5事务、视图、触发器、函数、数据库的备份

目录 一.事务(important) 1.1什么是事务? 1.2解决办法 1.2.1事务的语法 1.2.2使用事务解决转账问题代码演示 1.2.3rollback 1.3事务的特性(important) 二.存储引擎(important) 2.1 innodb 2.2 myisam 2.3两种引擎的区别 三.视图 四.触发器 4.1简述 4.2用法 4.2.1增加 4.2.2删除 五.存储过程 5.1存储过程的创建 5.2存储过程的删除 六.函数 七.数据库的备份 7.1数据库的备份 7.2数据

python操作mysql数据库(二)

在上一篇文章里面主要介绍了关于python3连接数据库,创建数据库以及创建表的相关内容,在接下来我们试着在我们刚才创建的表中插入数据,并对其做相关探究. #/usr/bin/env python #_*_coding:utf-8_*_ #导入pymysql模块 import pymysql #打开数据库链接 connect=pymysql.connect(host="192.168.186.157",port=3306,user="winner",passwd=&q

六.事务

一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A--B转帐,对应于如下两条sql语句  update from account set money=money+100 where name='B';  update from account set money=money-100 where name='A'; 二.MySQL数据库中操作事务命令 1.编写测试SQL脚本,如下: /*创建账户表*/ create table account(