mysql与事务
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,什么是事务事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务一、事务的特性(ACID) 原子性(At
千家信息网最后更新 2025年02月02日mysql与事务什么是事务
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务
一、事务的特性(ACID) 原子性(Atomicity) 一组操作·要么全成功,要么全失败。 一致性(Consistency) 保证数据的正确性,合理性,完整性。事务在完成时,必须使所有的数据都保持一致状态 例如,在一次转账过程中,从某一账户中扣除的金额必须与另一账户中存入的金额相等。 隔离性(Isolation) 一个会话不能修改另一个用户修改了但未提交的数据。 持久性(Durability) 一个事物一旦提交,数据库的数据所发生的变化是永久的。
二、事务的隔离级别 一般数据库中,有四种隔离级别
如上图,四种隔离级别分别实现了不同的功能,看是级别越高也代表着需要的锁越多,更容易产生阻塞。
接下来通过实验介绍这几种读 (1)脏读 把隔离级别调为READ-UNCOMMITTED root@localhost:mysql.sock 01:30:05 [(none)]>set global tx_isolation = 'READ-UNCOMMITTED'; root@localhost:mysql.sock 01:30:22 [(none)]>show global variables like '%iso%'; +---------------+------------------+ | Variable_name | Value | +---------------+------------------+ | tx_isolation | READ-UNCOMMITTED | +---------------+------------------+ 1 row in set (0.00 sec) 会话1: root@localhost:mysql.sock 01:34:06 [lala]>select * from score; Empty set (0.00 sec) root@localhost:mysql.sock 01:34:53 [lala]>begin; Query OK, 0 rows affected (0.00 sec) root@localhost:mysql.sock 01:35:23 [lala]>insert into score values(1,'xiaohong',99); Query OK, 1 row affected (0.00 sec) 还没有提交 会话2: root@localhost:mysql.sock 01:37:08 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 1 | xiaohong | 99 | +------+----------+-------+ 1 row in set (0.00 sec) 会话2可以直接读到会话1还没有提交的数据。 (2)不可重复读 root@localhost:mysql.sock 01:30:05 [(none)]>set global tx_isolation = 'READ-COMMITTED'; root@localhost:mysql.sock 01:30:22 [(none)]>show global variables like '%iso%'; +---------------+------------------+ | Variable_name | Value | +---------------+------------------+ | tx_isolation | READ-COMMITTED | +---------------+------------------+ 1 row in set (0.00 sec) 会话1: root@localhost:mysql.sock 01:49:00 [lala]>begin; Query OK, 0 rows affected (0.00 sec)
root@localhost:mysql.sock 01:49:08 [lala]>update score set id=3; Query OK, 1 row affected (0.00 sec)
会话2: root@localhost:mysql.sock 01:49:14 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 1 | xiaohong | 99 | +------+----------+-------+ 1 row in set (0.00 sec) 会话1: root@localhost:mysql.sock 01:49:20 [lala]>commit; Query OK, 0 rows affected (0.00 sec) 会话2: root@localhost:mysql.sock 01:49:47 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 3 | xiaohong | 99 | +------+----------+-------+ 1 row in set (0.00 sec) 会话2第一次只读到id的值是1,但以为会话1提交,会话2第二次读到id的值是3. (3)幻读 会话1: root@localhost:mysql.sock 01:49:00 [lala]>begin; Query OK, 0 rows affected (0.00 sec)
root@localhost:mysql.sock 01:49:08 [lala]>insert into score values(2,'xiaoming',65); Query OK, 1 row affected (0.00 sec)
会话2: root@localhost:mysql.sock 01:49:14 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 1 | xiaohong | 99 | +------+----------+-------+ 1 row in set (0.00 sec) 会话1: root@localhost:mysql.sock 01:49:20 [lala]>commit; Query OK, 0 rows affected (0.00 sec) 会话2: root@localhost:mysql.sock 01:50:27 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 3 | xiaohong | 99 | | 2 | xiaoming | 65 | +------+----------+-------+ 2 rows in set (0.00 sec) 会话2第一次只读到1条数据,但以为会话1提交,会话2第二次读到两条记录
ps:不可重复读是因为数据的update导致,而幻读是因为数据的delete或者insert导致
三、mysql中的事务 mysql默认开启事务自动提交,即每执行完一条sql语句自动提交一次。 那怎么禁用事务自动提交呢?如下: session级别: set autocommit=off; 局级别: 方法一:set global init_connect='set autocommit=0'; 方法二:修改参数文件my.cnf [mysqld] init_connect='set autocommit=0'; 方法三: 启动mysql服务时,加上参数 -init_connect='set autocommit=0'; 也可以通过begin开启一个事务,再通过commit提交; mysql的默认隔离级别 mysql中的innodb的事务默认隔离级别是Repeatable read(可重复读),但是它不是普通的Repeatable read,它在可重复读的基础上避免了幻读。是通过臭名昭著的gop锁实现不可重复读。 myql通过tx_isolation决定事务隔离级别 ,可以查看当前的参数 root@localhost:mysql.sock 01:17:04 [(none)]>show global variables like '%iso%'; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | tx_isolation | REPEATABLE-READ | +---------------+----------------+ 1 row in set (0.00 sec) 所以要想修改mysql的事务隔离级别,直接修改这个参数就行了。
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务
一、事务的特性(ACID) 原子性(Atomicity) 一组操作·要么全成功,要么全失败。 一致性(Consistency) 保证数据的正确性,合理性,完整性。事务在完成时,必须使所有的数据都保持一致状态 例如,在一次转账过程中,从某一账户中扣除的金额必须与另一账户中存入的金额相等。 隔离性(Isolation) 一个会话不能修改另一个用户修改了但未提交的数据。 持久性(Durability) 一个事物一旦提交,数据库的数据所发生的变化是永久的。
二、事务的隔离级别 一般数据库中,有四种隔离级别
如上图,四种隔离级别分别实现了不同的功能,看是级别越高也代表着需要的锁越多,更容易产生阻塞。
接下来通过实验介绍这几种读 (1)脏读 把隔离级别调为READ-UNCOMMITTED root@localhost:mysql.sock 01:30:05 [(none)]>set global tx_isolation = 'READ-UNCOMMITTED'; root@localhost:mysql.sock 01:30:22 [(none)]>show global variables like '%iso%'; +---------------+------------------+ | Variable_name | Value | +---------------+------------------+ | tx_isolation | READ-UNCOMMITTED | +---------------+------------------+ 1 row in set (0.00 sec) 会话1: root@localhost:mysql.sock 01:34:06 [lala]>select * from score; Empty set (0.00 sec) root@localhost:mysql.sock 01:34:53 [lala]>begin; Query OK, 0 rows affected (0.00 sec) root@localhost:mysql.sock 01:35:23 [lala]>insert into score values(1,'xiaohong',99); Query OK, 1 row affected (0.00 sec) 还没有提交 会话2: root@localhost:mysql.sock 01:37:08 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 1 | xiaohong | 99 | +------+----------+-------+ 1 row in set (0.00 sec) 会话2可以直接读到会话1还没有提交的数据。 (2)不可重复读 root@localhost:mysql.sock 01:30:05 [(none)]>set global tx_isolation = 'READ-COMMITTED'; root@localhost:mysql.sock 01:30:22 [(none)]>show global variables like '%iso%'; +---------------+------------------+ | Variable_name | Value | +---------------+------------------+ | tx_isolation | READ-COMMITTED | +---------------+------------------+ 1 row in set (0.00 sec) 会话1: root@localhost:mysql.sock 01:49:00 [lala]>begin; Query OK, 0 rows affected (0.00 sec)
root@localhost:mysql.sock 01:49:08 [lala]>update score set id=3; Query OK, 1 row affected (0.00 sec)
会话2: root@localhost:mysql.sock 01:49:14 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 1 | xiaohong | 99 | +------+----------+-------+ 1 row in set (0.00 sec) 会话1: root@localhost:mysql.sock 01:49:20 [lala]>commit; Query OK, 0 rows affected (0.00 sec) 会话2: root@localhost:mysql.sock 01:49:47 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 3 | xiaohong | 99 | +------+----------+-------+ 1 row in set (0.00 sec) 会话2第一次只读到id的值是1,但以为会话1提交,会话2第二次读到id的值是3. (3)幻读 会话1: root@localhost:mysql.sock 01:49:00 [lala]>begin; Query OK, 0 rows affected (0.00 sec)
root@localhost:mysql.sock 01:49:08 [lala]>insert into score values(2,'xiaoming',65); Query OK, 1 row affected (0.00 sec)
会话2: root@localhost:mysql.sock 01:49:14 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 1 | xiaohong | 99 | +------+----------+-------+ 1 row in set (0.00 sec) 会话1: root@localhost:mysql.sock 01:49:20 [lala]>commit; Query OK, 0 rows affected (0.00 sec) 会话2: root@localhost:mysql.sock 01:50:27 [lala]>select * from score; +------+----------+-------+ | id | name | score | +------+----------+-------+ | 3 | xiaohong | 99 | | 2 | xiaoming | 65 | +------+----------+-------+ 2 rows in set (0.00 sec) 会话2第一次只读到1条数据,但以为会话1提交,会话2第二次读到两条记录
ps:不可重复读是因为数据的update导致,而幻读是因为数据的delete或者insert导致
三、mysql中的事务 mysql默认开启事务自动提交,即每执行完一条sql语句自动提交一次。 那怎么禁用事务自动提交呢?如下: session级别: set autocommit=off; 局级别: 方法一:set global init_connect='set autocommit=0'; 方法二:修改参数文件my.cnf [mysqld] init_connect='set autocommit=0'; 方法三: 启动mysql服务时,加上参数 -init_connect='set autocommit=0'; 也可以通过begin开启一个事务,再通过commit提交; mysql的默认隔离级别 mysql中的innodb的事务默认隔离级别是Repeatable read(可重复读),但是它不是普通的Repeatable read,它在可重复读的基础上避免了幻读。是通过臭名昭著的gop锁实现不可重复读。 myql通过tx_isolation决定事务隔离级别 ,可以查看当前的参数 root@localhost:mysql.sock 01:17:04 [(none)]>show global variables like '%iso%'; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | tx_isolation | REPEATABLE-READ | +---------------+----------------+ 1 row in set (0.00 sec) 所以要想修改mysql的事务隔离级别,直接修改这个参数就行了。
事务
级别
数据
隔离
参数
一致
方法
一致性
单元
原子
属性
持久性
数据库
第一次
要么
账户
逻辑
金额
不同
普通
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
安徽食品行业进口软件服务器软件
超级动物大逃杀无法连接服务器
武林外传 英雄服务器创世
什么是网络安全密钥怎么才能解开
双色球球数据库
贵州计算机三级网络技术
格利网络技术有限公司
软件开发pkpm
绝地求生测试服服务器加载失败
怎么在pdb数据库查文献
网络安全主题简笔画视频
企业管理器怎么建数据库
云上贵州服务器集群云空间
海康流媒体转发服务器
大话手游转服务器
即时通讯软件开发服务好态度好
命令行数据库建表
无锡电脑软件开发服务费
将云服务器ip资源转换
服务器cpu适合多应用
网络安全最前沿的东西
db2 数据库状态
中外运数据库
网络安全工作 督查汇报
我的世界清风服务器怎么注册登录
数据库介绍手册
modbus 软件开发书
中国电信网络安全专业就业方向
网络安全零基础指令
e购折扣服务器管理