十一、事务

十一、事务,第1张

数据库事务( transaction)是访问并可能 *** 作各种数据项的一个数据库 *** 作序列,这些 *** 作要么全部执行, 要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库 *** 作组成

事务是由一组SQL语句 组成的逻辑处理单元,它的ACID特性如下:

(1) 原子性(Atomicity):事务具有原子不可分割的特性,要么一起执行,要么都不执行。

(2) 一致性(Consistency):在事务开始和事务结束时,数据都保持一致状态。

(3) 隔离性(Isolation):在事务开始和结束过程中,事务保持着一定的隔离特性,保证事务不受外部并发数据 *** 作的影响。

(4) 持久性(Durability):事务完成后,数据将会被持久化到数据库中。

 事务有两状态一个是提交【commit】,一个是回滚【rollback】。

BEGIN ; -- 开启事务 提交 commit或 回滚rollback
UPDATE account SET abalance=abalance-2000 WHERE aid=1;
UPDATE account SET abalance=abalance+2000 WHERE aid=2;
COMMIT;
或
ROLLBACK;

还可以设置打点事务,即再保存点之前的会提交,保存点之后的会回滚

START TRANSACTION ;
UPDATE account SET abalance=abalance-10 WHERE aid=1;
SAVEPOINT A;
UPDATE account SET abalance=abalance-1000 WHERE aid=1;
UPDATE account SET abalance=abalance+1000 WHERE aid=2;
ROLLBACK TO A;

事务隔离级别:一个事务对数据库修改与并行的另一个事务的隔离程度。 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:

1、幻想读,2、不可重复读取 ,3、脏读

为了处理这些问题,SQL标准定义了以下几种事务隔离级别

脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable read××
Serializable×××

脏读:事务A读取到事务B未提交的数据。

        比如账号1的账号金额是5000,此时事务B,将1账号的金额更改为8000,但是还未提交事务,此时事务A,查看1账号的金额,看到8000,然后事务B对 *** 作做了回滚。事务A就读取到脏数据。

        如果将事务的隔离级别提高到Read uncommitted,便不会产生以上情况。

不可重复读:事务A查看1账号的金额是2000,此时想再账号上减2000.但是还没 *** 作的时候,事务B,将数据更改了,并再事务A之前提交了事务。此时事务A再次读取该数据的时候,已经改变了。

         事务的隔离级别提高到Read committed时,避免了脏读,但是会造成不可重复度。大多数数据库 的默认级别就是ReadCommited.可以将事务的隔离级别提高到Repeatable read。也就是事务A读取了数据,再未提交事务的时候,事务B不能对数据进行修改。

幻读:事务A查看第一次查看记录的时候为80。此时,事务B对该记录做了更改,事务A再看的时候,发现不是80,事务A就像出现环境一样。将隔离级别提高到Serializable就可以避免幻读。

查看mysql的事务隔离级别

SELECT @@transaction_isolation; [select @@tx_isolation;]

设置mysql的事务隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

脏读:事务A读取到事务B未提交的数据。脏数据所指的就是未提交的数据 设置事务A与事务B的隔离级别为Read uncommitted;

事务A[事务A读取到的8000就是脏数据]事务B
READ UNCOMMITTED;READ UNCOMMITTED;
select * from account ;-- 5000select * from account;--5000
begin;
update account set balance=8000 where accid=1;
select * from account ;-- 8000
rollback

  *** 作:事务A和事务B都设置事务的隔离级别为READ UNCOMMITTED;

事务B开启事务,并更新记录为8000,此时并未提交

事务A查看数据,看到了8000的结果。

事务B又做了回滚,此时事务A读取到的8000,就属于

不可重复读:一个事务先后读取同一条记录,而事务在两次读取之间该数据被其它事务所修改,则两次读取的数据不同,我们称之为不可重复读。 设置事务A与事务B的隔离级别为Read committed;

事务A事务B
READ COMMITTED;READ COMMITTED;
select * from account ;-- 5000select * from account;--5000
begin;
update account set balance=balance+3000 where accid=1;
COMMIT;
begin;
update account set balance=balance+3000 where accid=1;
COMMIT;
select * from account;-- 11000??select * from account;-- 8000

幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。

设置事务A与事务B的隔离级别为REPEATABLE READ;

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/883257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存