mysql事务

什么是事务


一系列有序的数据库操作:

  • 要么全部成功
  • 要么全部回退到操作前状态
  • 中间状态对其他连接不可见

事务的基本操作

基本操作 说明
start transaction; 开始事务
commit; 提交(全部完成)
rollback; 回滚(回到初始状态)

图中便是数据库中的事务操作;及 开始事务-->SQL操作-->commit/rollback;

savepoint,保存点,在事务回滚时,可以回滚到保存点;

而提交只能全部提交不能仅提交保存点;

savepoint  savepoint_name;
rollback to savepoint_name;
commit;

事务开始也可以用 begin;或者 start transaction;

清空表数据:

mysql> select * from ttt;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    1 |
+---+------+------+
1 row in set (0.00 sec)
mysql> truncate table ttt;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from ttt;
Empty set (0.00 sec)

当多个连接同时连在一个数据库中时,truncate 命令无法使用

自动提交(默认开启)


即在我们数据语句后,系统自动给我们加上了COMMIT;

  • autocommit可以在session级别设置
  • 每个DML操作都自动提交
  • DDL永远是自动提交,无法通过rollback回滚
mysql> show  variables like ‘%autocommit%‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set session autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> show  variables like ‘%autocommit%‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

此时,在这个session中将DML将不会自动提交;

而如果在DML语句后我们进行了一句 DDL语句:

alter table ttt add new int(11);增加了一个字段;此时之前的DML也会自动提交,

因为DDL永远都会在语句后面自动COMMIT,而也顺带把之前的DML语句也提交了;

基本属性


事务的四个基本属性(ACID)酸

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

事务的原子性(事务被打包一起执行或者一起撤销)

  • 包含在事务中的操作要么全部被执行,要么都不执行
  • 中途数据库或者应用发生异常,未提交的事务都应该被回滚

事务的一致性(各种约束条件,保证事务的正确合理,完成性)

数据正确性,合理性,完整性

数据一致性应该符合应用需要规则

  • 余额不能为负数
  • 交易对象必须先有账号
  • 用户账号不能重复

事务的结果需要满足数据的一致性约束

事务的持久性(提交后的事务持久化到磁盘)

  • 提交完成的事务会数据库的影响必须是永久性的
  • 数据库异常不会丢失事务更新
  • 通常认为成功写入磁盘的数据即为持久化成功

事务的持久化实现

机械硬盘对随机的读写非常慢,所以数据并不是同步刷新的。当update set a =3 ,commit ;

顺序写到事务日志中去,然后在空闲时,顺序的异步刷新到磁盘中去;这样速度回比较快,

因为机械硬盘对顺序读写操作的速度还是很快的。但如果数据库发现异常宕机了,

此时磁盘上的记录并没有得到修改,这时候需要通过回放事务日志的方式,也就是通过事务日志,重新将事务,更新到磁盘中去。

事务的隔离性

数据库事务在提交完成前,中间的任何数据变化对其他的事务都是不可见的。

隔离现象

  • 脏读:Dirty Read
  • 不可重复读:NonRepeatable Read
  • 幻读:Phantom Read

隔离等级

  • 未提交读:Read uncommitted
  • 已提交读:Read committed
  • 可重复读:Repeatable  Read
  • 可串行化:Seriallizable

mysql的事务隔离级别


tx_isolation 设置隔离级别;

数据库的隔离现象与隔离级别的演示

隔离现象

  1. 脏读:Dirty Read
  2. 不可重复读:NonRepeatable Read
  3. 幻读:Phantom Read

隔离等级

  1. 未提交读:Read uncommitted
  2. 已提交读:Read committed
  3. 可重复读:Repeatable  Read
  4. 可串行化:Seriallizable

默认情况下:

查看隔离级别:

mysql> show global variables like "%iso%";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+

修改隔离级别:

set global  tx_isolation = ‘READ-COMMITTED ‘;

READ UNCOMMITTED (未提交读) 的 dirty read(脏读)现象:

脏读现象:即A连接,未提交的事务,B连接的事务可以看到;

READ COMMITTED(已提交读)的NONREPEATABLE READ(不可重复读)现象:

A连接,提交的事务,B连接的事务中可以看到,这样在B连接中的事务,就可以看到A连接事务提交前,和提交后两种状态;PS:叫可重复读不是更贴切?

注意:不可重复读针对update,delete

READ COMMITTED(已提交读)的PHANTOM READ(幻读)现象:

A连接,提交的事务,B连接的事务可以看到,这样在B连接中的事务,就可以看到A连接事务提交前,和提交后两种状态;

注意:幻读针对insert;

REPEATABLE-READ(可重复读)的PHANTOM READ(幻读)现象:

但是在mysql中innodb事务引擎,将可重复读的幻读现象也消除掉了;

通过gap lock  间隙锁来 粗暴的实现

可重复读:即消除了不可重复读的现象;

事务与并发写


某个正在更新的记录在提交或回滚前不能被其他事务同时更新;

引入锁的概念;在innodb中会具体讲解;

并发写是不允许的,而如果A事务写,B事务读是可以的。这个读受到数据库隔离级别的影响;

innodb 使用MVCC非锁定读技术,从undo log中读取行记录的快照;这样读行就不需要等待锁资源,提高了并发;

数据库回滚的实现


回滚段(rollback segment)与数据前像

  • 回滚段也帮助实现事务的隔离性
  • InnoDB存储引擎异常恢复过程中需要用到回滚段..

总结


  • savepoint:可以回滚到保存点,不可以提交保存点
  • 清空表数据:truncate table tbl
  • autocommit:DML可以设置不自动提交,DDL永远自动提交
  • ACID
    •   事务的原子性(事务被打包一起执行或者一起撤销)
    •   事务的一致性(各种约束条件,保证事务的正确合理,完成性)
    •   事务的持久性(提交后的事务持久化到磁盘)
    •   事务的隔离性:
        •   隔离现象:脏读,不可重复读--update,delete,幻读--insert;
        •   隔离等级:未提交读,已提交读,可重复读,可串行化
  • innodb默认repeatable read
  • innodb的repeatable read 消除了幻读现象通过gap lock 间隙锁粗暴实现;
  • 非锁定读技术:MVCC,从undo log读取行记录快照
  • 数据库回滚的实现:回滚段与数据前像;
时间: 2024-10-24 13:36:12

mysql事务的相关文章

数据库-mysql事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

MySQL 事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

MySQL事务详解

事务:Transaction 多个sql语句,要么同时都执行,要么同时都不执行 事务就是一组原子性的(select)查询语句,也即将多个查询当作一个独立的工作单元 ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务 A:Atomicity,原子性,都执行或者都不执行 C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态 I:Isolaction,隔离性.一个事务的所有修改操作在提交前对其他事务是不可见的 D: Durability, 持久性,一旦事务得到提交,其

Mysql事务&字符集

Mysql事务 Innodb存储引擎的中的事务完全服务ACID: 原子性.2.一致性.3.隔离性.4.持久性 理解上和oracle类似. 事务隔离级别 1.Read uncommitted 读未提交: 2.Read committed 读已提交: 3.Repeatable read 可重复读,类似oracle利用undo的闪回查询: 4.Serializable 串行读,很少用. 隔离级别的修改: 通过set命令: 通过修改配置文件,启动数据库的默认隔离级别-mysqld Mysql字符集 My

MYSQL事务及存储引擎对比

Innodb支持事务,而myisam不支持事务. 事务的定义: 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性状态,这时有必要引入事务的概念. Mysql提供了多种引擎支持Innodb和BDB.Innodb存储引擎事务主要通过UNDO日志和REDO日志实现,Myisam和memory引擎则不支持事务.下图分别给出三种mysql引擎的区别和特性: Myisam存储引擎:由于该引擎不支持事务.也不支持外键,所以

十、mysql事务的简介

1. myisam跟memory支持表级别锁定 BDB 页级锁定 Innodb 行级锁定 2.表锁(不是表嫂哈) lock table read //只读表锁,也就是说执行了这个锁后,锁内的操作只能为读操作 select * from ..... unlock tables; lock table write //读写表锁,可读可写 insert ... update ... select ... delete ... unlock tables; PS::表被锁定后,其他连接的操作将被挂起,直

查询mysql事务隔离级别

查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set session transaction isolatin level repeatable read; 4.设置系统当前隔离级别 s

MySQL 事务功能

MySQL 事务功能 事务:  1.介绍 ★事务: 一组原子性的SQL查询.或者是一个或多个SQL语句组成的独立工作单元: ★ACID测试: ☉A:AUTOMICITY,原子性: 整个事务中的所有操作要么全部成功执行,要么全部失败后回滚: ☉C:CONSISTENCY,一致性: 数据库总是应该从一个一致性状态转为另一个一致性状态: ☉I:ISOLATION,隔离性: 一个事务所做出的操作在提交之前,是否能为其它事务可见:出于保证并发操作之目的,隔离有多种级别: ☉D:DURABILITY,持久性

Mysql事务-隔离级别

MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被视为一个不可分割的单元: 一致性(Consistency):数据库总是从一种状态切换到另一种状态: 隔离性(Isolation):通常来说,事务在提交前对于其他事务不可见: 持久性(Durablity):一旦事务提交,所做修改永久保存数据库: 事务最常用的例子就是银行转账.假设polo需给lynn转

PHP mysql事务问题实例分析

本文实例分析了PHP的mysql事务问题.分享给大家供大家参考,具体如下: 对于myisam数据库,可以控制事务的进行: $mysqlrl = mysql_connect ( $db_config ["host"], $db_config ["user"], $db_config ["pass"], true ); if (! $mysqlrl) { $msg = mysql_error (); die ( 'Could not connect: