mysql的事务,隔离级别和锁用法实例分析


当前第2页 返回上一页

先准备一张表,和一点数据。

CREATE TABLE `account` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `name` varchar(32) DEFAULT '' COMMENT '名称',
 `money` decimal(11,2) DEFAULT '0.00' COMMENT '金钱',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `account` (`name`, `money`) VALUES ('A', '500.00');
INSERT INTO `account` (`name`, `money`) VALUES ('B', '100.00');

1、读取未提交

set transaction_isolation = 'READ-UNCOMMITTED';
set autocommit = 0;

事务B修改了表中的数据,但是未提交,事务A确读取到了修改后的数据。如果因为某些原因,事务B回滚了,事务A读取的这个数据就是脏数据。

2、读已提交

set transaction_isolation = 'READ-COMMITTED';
set autocommit = 0;

事务B修改数据但没有提交,那么事务A仍然获取的原来数据,解决了脏读的问题。

但是事务B提交,事务A执行上一次查询,结果与上一次查询不一致,这就产生不可重复读的问题。

3、可重复读取

set transaction_isolation = 'REPEATABLE-READ';
set autocommit = 0;

事务B修改了数据并提交了,事务A两次查询的结果是一致的,解决了不可重复读的问题。

这个时候,事务A去修改name为A的money数据

name为A的money变成了350,而不是400,可重复读保证了数据的一致性。

我们重新在事务A中修改所有账号的money等于200,同时在事务B中插入一条新的数据。

事务A中获取的仍然是两条数据,解决了新增数据时,事务A出现的幻读问题。

4、序列化

set transaction_isolation = 'SERIALIZABLE';
set autocommit = 0;

事务A对表进行查询,如果没有提交,则事务B的插入语句一直等待在那里,直到超时或事务A提交。

反之,事务B对表进行插入后,没有提交,则事务A对表的查询也一直等待,直到事务B提交。

此时对表的读写都会进行锁表,当然对并发性能的影响也比较大。

隔离级别越高,越能保证数据的完整性和一致性。

六、mysql的锁

锁分为两种类型:

内部锁:mysql服务器内部执行的内部锁,以管理多个会话对表内容的争用。

外部锁:mysql为客户会话提供显式地获取表锁,以阻止其他会话访问表。

内部锁又会为两种类型:

1、行级锁:行级锁是细粒度的,只有被访问的行会被锁定,这允许多个会话同时进行写访问。

2、表级锁:mysql对myisam,memory和merge表使用表级锁,一次只允许一个会话更新表,这使得这些存储引擎更适用于以读取为主的操作。

外部锁:可以使用 LOCK TABLE 和 UNLOCK TABLE 来控制锁定。

READ (共享锁) :多个会话可以从表中读取数据而不需要获取锁,此外,多个会话可以在同一表上获得锁,当 READ 锁时,没有会话可以将数据写入表中。任何写入操作都将处于等待状态,直到 READ 锁被释放。

WRITE (排他锁) :当表被 WRITE 锁定时,除持有该锁的会话外,其他会话都不能读取或写入数据,除非 WRITE 锁被释放。

锁表的语句:

LOCK TABLES table_name [READ | WRITE];

解锁表的语句:

UNLOCK TABLES;

锁定数据库中所有表:

FLUSH TABLES WITH READ LOCK;

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL索引操作技巧汇总》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

更多Mysql内容来自木庄网络博客


标签:Mysql

返回前面的内容

相关阅读 >>

mysql错误代码1064解决办法是什么?

mysql无法连接本地地址localhost怎么办

mysql如何更改数据保存的路径

mysql如何在原值增加

mysql select 语句的基本用法

mysql和redis有什么区别

怎么在mysql里面打开文件

mysql怎么查看已建的表

大数据学习之二 mysql进阶

mysql如何批量删除数据库中的数据

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...