标签:永久 单位 ble http 一致性 语法 问题 完成 关系型数据库
事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务.
一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成
事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同
相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。
1.脏读(Dirty Reads):一个事务可以读取另一个尚未提交事务的修改数据。
2.不可重复读(Non-Repeatable Reads):同一个事务中,多次查询某个数据,却得到不同的结果。
3.幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据。
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别
事物A和事物B,事物A未提交的数据,事物B可以读取到
这里读取到的数据叫做“脏数据”
这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别
事物A和事物B,事物A提交的数据,事物B才能读取到
这种隔离级别高于读未提交
换句话说,对方事物提交之后的数据,我当前事物才能读取到
这种级别可以避免“脏数据”
这种隔离级别会导致“不可重复读取”
Oracle默认隔离级别
事务A和事务B,事务A提交之后的数据,事务B读取不到
事务B是可重复读取数据
这种隔离级别高于读已提交
换句话说,对方提交之后的数据,我还是读取不到
这种隔离级别可以避免“不可重复读取”,达到可重复读取
比如1点和2点读到数据是同一个
MySQL默认级别
虽然可以达到可重复读取,但是会导致“幻像读”
事务A和事务B,事务A在操作数据库时,事务B只能排队等待
这种隔离级别很少使用,吞吐量太低,用户体验差
这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发
可以在my.ini文件中使用transaction-isolation选项来设置服务器的缺省事务隔离级别。
[mysqld]
transaction-isolation = READ-COMMITTE(READ-UNCOMMITTED、REPEATABLE-READ、SERIALIZABLE)
通过命令动态设置隔离级别
隔离级别也可以在运行的服务器中动态设置,应使用SET TRANSACTION ISOLATION LEVEL语句。
其语法模式为:SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
例如:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
隔离级别可以划分为会话级、全局级
会话级:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
全局级:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
标签:永久 单位 ble http 一致性 语法 问题 完成 关系型数据库
原文地址:https://www.cnblogs.com/qixc/p/12952329.html