MySQL中的事务
来源:互联网 发布:网络设计方案案例 编辑:程序博客网 时间:2024/06/08 07:54
MySQL事务是由MySQL引擎支持的,不同的MySQL的引擎对事务的支持程度不同。事务有四种特性,针对事务的隔离性,MySQL也实现了不同的隔离级别。
事务
事务有四个特性,通常被称为ACID,分别为原子性(Automicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
1、原子性:整个事务的操作是原子操作,一次操作要么全部成功,要么回滚到原始状态,不会停滞在中间的某个环节。
2、一致性:多个事务并发时,确保数据库正确改变状态后,成功提交事务,保证数据的一致性。
3、隔离性:事务彼此之间的操作是透明的,不会相互影响。
4、持久性:事务执行完成,成功提交后,对数据库的改变会持久的保存在数据库中,不会因为事务的原因丢失。
隔离级别
虽然事务因为隔离性,彼此之间操作互不影响,但是不同的隔离级别使得不同事务操作相同数据时会使数据出现错误情况。例如,脏数据、不可重复读、幻读的情况。为了解决这些问题,数据库设计时可以采用不同的隔离级别,因为一方面要考虑到数据的安全性,一方面也要考虑到数据库的性能。MySQL的InnoDB引擎默认的事务级别是重复读,当然也可以对其进行设置。下面就针对事务的不同隔离级别对MySQL做一个测试。
准备工作
首先查看一下自己的数据库引擎,默认安装不修改的话,数据库引擎是InnoDB。
mysql> show variables like '%engine%';+----------------------------+--------+| Variable_name | Value |+----------------------------+--------+| default_storage_engine | InnoDB || default_tmp_storage_engine | InnoDB || storage_engine | InnoDB |+----------------------------+--------+3 rows in set
查看默认隔离级别,可以查看当前会话的,也可以查看全局的。当然,更改的时候也可以更改当前会话以及全局的。
mysql> select @@global.tx_isolation, @@tx_isolation;+-----------------------+-----------------+| @@global.tx_isolation | @@tx_isolation |+-----------------------+-----------------+| REPEATABLE-READ | REPEATABLE-READ |+-----------------------+-----------------+1 row in set
mysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in set
未提交读
因为要模拟两个事务,所以现在开两个会话,各自会话都设置隔离级别为未提交读。两个会话分别执行以下操作:
mysql> set tx_isolation='read-uncommitted';Query OK, 0 rows affectedmysql> select @@tx_isolation;+------------------+| @@tx_isolation |+------------------+| READ-UNCOMMITTED |+------------------+1 row in set
会话1:
mysql> start transaction;Query OK, 0 rows affectedmysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in set
mysql> start transaction;Query OK, 0 rows affectedmysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in setmysql> update testTransaction set A = 2;Query OK, 1 row affectedRows matched: 1 Changed: 1 Warnings: 0
mysql> select * from testTransaction;+---+| A |+---+| 2 |+---+1 row in set
提交读
既然事务尚未提交,别的事务就可以读到数据,为了解决这一脏读问题,出现了提交读的隔离级别。下面就把两个会话的隔离级别都设置为提交读,两个会话都进行以下操作:
mysql> set tx_isolation='read-committed';Query OK, 0 rows affectedmysql> select @@tx_isolation;+----------------+| @@tx_isolation |+----------------+| READ-COMMITTED |+----------------+1 row in set
会话1:
mysql> start transaction;Query OK, 0 rows affectedmysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in set
mysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in setmysql> update testTransaction set A = 2;Query OK, 1 row affectedRows matched: 1 Changed: 1 Warnings: 0
mysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in set
mysql> commit;Query OK, 0 rows affected
mysql> select * from testTransaction;+---+| A |+---+| 2 |+---+1 row in set
重复读
重复读隔离级别设置后,事务A不管事务B的操作是否提交,只要事务A尚未提交,那么它读到的数据就是不变的。下面把两个会话的隔离级别都设置为重复读,两个会话都进行以下操作:
mysql> set tx_isolation = 'repeatable-read';Query OK, 0 rows affectedmysql> select @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set
会话1:
mysql> start transaction;Query OK, 0 rows affectedmysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in set
mysql> start transaction;Query OK, 0 rows affectedmysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in setmysql> update testTransaction set A = 2;Query OK, 1 row affectedRows matched: 1 Changed: 1 Warnings: 0
mysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in set
mysql> commit;Query OK, 0 rows affected
mysql> select * from testTransaction;+---+| A |+---+| 1 |+---+1 row in set
序列化
为了解决幻读的问题,出现序列化的隔离级别。它是安全级别最高的,但同时也是性能最低的,MySQL默认支持到重复读,有兴趣的读者可以自己试试序列化的方式。
事务操作
事务操作有三种,开启、提交和回滚。MySQL开启事务有两种方式,start transaction和begin,别的写法都是错误的。提交事务只需要commit就可以了,但是MySQL的命令列操作都是需要在命令结尾加分号的。至于回滚事务,就是直接rollback就好了,当然也不要忘了分号。
- Mysql 中的事务
- MySQL中的事务
- MySql中的事务
- MySQL中的事务
- 漫谈MySql中的事务
- 说说MySQL中的事务
- MySQL中的XA事务
- MySQL中的事务初探
- mysql中的事务总结
- mysql数据库中的事务
- Mysql中的事务
- mysql中的事务
- 漫谈MySql中的事务
- Mysql中的事务
- mysql 中的事务
- MySQL中的事务
- MYSQL中的事务
- 了解MySql中的 事务
- 剑指offer-面试题32-从1到n整数中1出现的次数
- 【计算机视觉】结构光——格雷码模式捕获教程1 (代码)
- android 局部更新
- “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛【9/10】
- android移动应用开发学习笔记(五)——模拟qq登陆界面
- MySQL中的事务
- 如何使用webpack+react+redux从头搭建Todolist应用
- 动态规划解背包问题
- ffmpeg()音频转码
- Mysql随堂笔记
- 不是你无法入门自然语言处理(NLP),而是你没找到正确的打开方式
- C++ typedef用法
- xml验证
- Java实现快速排序算法