SQL事务详解
#TCL
/*
Transaction Control Language 事务控制语⾔
事务:
⼀个或⼀组sql语句组成⼀个执⾏单元,这个执⾏单元要么全部执⾏,要么全部不执⾏。案例:转账
张三丰 1000
郭襄 1000
update 表 set 张三丰的余额=500 where name=‘张三丰’
意外
update 表 set 郭襄的余额=1500 where name=‘郭襄’
事务的特性:
ACID
原⼦性:⼀个事务不可再分割,要么都执⾏要么都不执⾏
⼀致性:⼀个事务执⾏会使数据从⼀个⼀致状态切换到另外⼀个⼀致状态
隔离性:⼀个事务的执⾏不受其他事务的⼲扰
持久性:⼀个事务⼀旦提交,则会永久的改变数据库的数据.
事务的创建
隐式事务:事务没有明显的开启和结束的标记
⽐如insert、update、delete语句
delete from 表 where id =1;
显式事务:事务具有明显的开启和结束的标记
前提:必须先设置⾃动提交功能为禁⽤
set autocommit=0;
session如何设置和读取
步骤1:开启事务
set autocommit=0;
start transaction;可选的
步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
步骤3:结束事务
commit;提交事务
rollback;回滚事务
savepoint 节点名;设置保存点
脏读:⼀个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
不可重复读:⼀个事务多次读取,结果不⼀样
幻读:⼀个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插⼊”的数据
==对于同时运⾏的多个事务,当这些事务访问数据库中相同的数据时,如果没
有采取必要的隔离机制,就会导致各种并发问题==:
1、脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段.
之后,若T2回滚,T1读取的内容就是临时且⽆效的.
2、不可重复读:对于两个事务T1,T2,T1读取了⼀个字段,然后T2更新了该字段.
之后,T1再次读取同⼀个字段,值就不同了.
3、幻读:对于两个事务T1,T2,T1从⼀个表中读取了⼀个字段,然后T2在该表中插
⼊了⼀些新的⾏.之后,如果T1再次读取同⼀个表,就会多出⼏⾏.
数据库事务的隔离性:数据库系统必须具有隔离并发运⾏各个事务的能⼒,
使它们不会相互影响,避免各种并发问题.
⼀个事务与其他事务隔离的程度称为隔离级别.数据库规定了多种事务隔
离级别,不同隔离级别对应不同的⼲扰程度,隔离级别越⾼,数据⼀致性就
越好,但并发性越弱.
事务的隔离级别:
脏读不可重复读幻读
读未提交  read uncommitted:  √  √  √
读已提交  read committed:    ×  √  √ 可以避免脏读
可重复读  repeatable read:  ×  ×  √ 可以避免脏读、不可重复读和⼀部分幻读
串⾏化    serializable    ×          ×          × 可以避免脏读、不可重复读和幻读
mysql中默认 第三个隔离级别 repeatable read
oracle中默认第⼆个隔离级别 read committed
Oracle ⽀持的 2 种事务隔离级别:READ COMMITED,SERIALIZABLE. Mysql ⽀持 4 种事务隔离级别.
查看隔离级别
select @@tx_isolation;
设置隔离级别 session:当前 global :全局
set session|global transaction isolation level 隔离级别;
开启事务的语句;
update 表 set 张三丰的余额=500 where name=‘张三丰’
update 表 set 郭襄的余额=1500 where name=‘郭襄’
结束事务的语句;
*/
```javascript
```javascript
SHOW VARIABLES LIKE'autocommit';
SHOW ENGINES; #来查看mysql⽀持的存储引擎。
#其中innodb⽀持事务,⽽myisam、memory等不⽀持事务
#1.演⽰事务的使⽤步骤
#开启事务
SET autocommit=0;
START TRANSACTION;
#编写⼀组事务的语句
UPDATE account SET balance =1000WHERE username='张⽆忌'; UPDATE account SET balance =1000WHERE username='赵敏';
#结束事务
ROLLBACK;
#commit;
SELECT*FROM account;
#2.演⽰事务对于delete和truncate的处理的区别
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
#3.演⽰savepoint 的使⽤
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滚到保存点
SELECT*FROM account;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。