MySQL事务&锁机制

一、事务(transaction)

1、概念
事物用于保护多个SQL语句的执行,只要有一个失败则全部失败,反之都成功。
2、事务语法(SQL语句)
开启事务:start transaction 或 begin
提交事务:commit
回滚事务:rollback
注意:
-> 存储引擎必须是innodb
-> 默认是开启事务的
-> 后期通过PHP判断是否都执行成功commit,失败rollback
3、PHP业务逻辑示例
在这里插入图片描述

1 #1.创建PDO对象
2 $pdo = new PDO('mysql:dbname=db2', 'root', 'root');
3 #2.开启事务
4 $pdo->beginTransaction();
5 #3.业务逻辑代码
6 $rs = $pdo->exec('执行SQL语句插入主表');
7 if (!$rs) {
8 	$pdo->rollback();
9 	exit;
10 }
11 
12 foreach ($orderInfos as $orderInfo) {
13 	$rs = $pdo->exec('执行SQL语句插入从表');
14 	if (!$rs) {
15		$pdo->rollback();
16		exit;
17 	}
18 }
19 
20 $pdo->commit();
21 echo '订单创建成功';

在这里插入图片描述

1 #1.连接数据库
2 try {
3    $pdo = new PDO($dsn, $user, $password);
4 } catch (PDOException $e) {
5     die("数据库连接失败".$e->getMessage());
6 }
7 
8 #2.执行数据操作
9 try{
10     //开启事物 
11     $pdo->beginTransaction();
12     //插入数据
13     $rs = $pdo->exec('执行SQL语句插入主表');
14    if (!$rs) throw new Exception("主表插入失败");
15     //-------------------------------------------
16     foreach ($orderInfos as $orderInfo) {
17     	$rs = $pdo->exec('执行SQL语句插入从表');
18     	if (!$rs) throw new Exception("从表插入失败");
19     }
20    $pdo->commit();
21  	echo '订单创建成功';
22 }catch(PDOException $e){
23    echo '执行失败'.$e->getMessage();
24    $pdo->rollback();
25 }

5、事务的特性(ACID)
原子性(Atomicity):开启事物后的所有操作要么全部提交成功,要么全部失败回滚
隔离性(Isolation):多用户操作,A开启事物后,不会被B干扰
一致性(Consistency):数据库数据从一个一致性的状态转换到另一个一致性的状态。
举例假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来还得是5000,这就是事务的一致性
永久性(Durability):提交事务后对数据的修改是永久性的

二、锁机制

1、概念
在MySQL数据库中MyISAM存储引擎采用的是表级锁,InnoDB存储引擎采用的是行级锁、也支表级锁。
锁分两种模式:
①共享读锁/共享锁(lock table 表名 read)
特性:自己-只能读,其他(读-可以,写-堵塞)
②独占写锁/排它锁(lock table 表名 write)
特性:自己-可读可写,其他(读-堵塞,写-堵塞)
释放锁:unlock table
2、示例(表锁)
-> MyISAM表锁

1 create table lock_t1 (
2 id int primary key auto_increment,
3 name varchar(30) not null 
4 )engine=myisam charset=utf8;
5
6 #session1,开启共享锁:自己-仅可以读,其他人(读-可以,写-堵塞)
7 lock table lock_t1 read;
8 #session1,读(可以)
9 #session1,写(不可以-报错)
10 #session2,读(可以)
11 #session2,写(不可以-堵塞)
12 unlock table;
13
14 #session1,开启排他锁:自己-可读可写,其他人(读-堵塞,写-堵塞)
15 lock table lock_t1 write;  
16 #session1,读(可以)
17 #session1,写(可以)
18 #session2,读(不可以-堵塞)
19 #session2,写(不可以-堵塞)
20 unlock table;

-> InnoDB表锁

1 create table lock_t2 (
2 id int primary key auto_increment,
3 name varchar(30) not null 
4 )engine=innodb charset=utf8;
5
6 #session1,开启共享锁
7 lock table lock_t2 read;  
8 #session1,读(可以)
9 #session1,写(不可以-报错)
10 #session2,读(可以)
11 #session2,写(不可以-堵塞)
12 unlock table;
13
14 #session1,开启排他锁
15 lock table lock_t2 write;  
16 #session1,读(可以)
17 #session1,写(可以)
18 #session2,读(不可以-堵塞)
19 #session2,写(不可以-堵塞)
20 unlock table;

3、示例(行锁)
行锁就是锁一条数据

1 create table lock_t3 (
2 id int primary key auto_increment,
3 name varchar(30) not null 
4 )engine=innodb charset=utf8;
5
6 insert into lock_t3 value (null, 'aaa');
7 insert into lock_t3 value (null, 'aaa');
8
9 #窗口1
10 begin;
11 update lock_t3 set name = 'bb' where id = 1;
12 
13 #窗口2(行级锁所以堵塞)
14 update lock_t3 set name = 'ccc' where id = 1;
15
16 #发现:窗口2堵塞,这时候打开窗口1执行commit发现执行完毕后,窗口后陆续执行
17 #最后:查询lock_t3表结果,结果为ccc因为窗口2后执行

4、表锁与行锁的区别
表级锁代表(MyISAM):
-> 开销小,加锁快
-> 发生锁冲突的概率最高,并发度最低(堵塞频率高)
行级锁(InnoDB):
-> 开销大,加锁慢
-> 发生锁冲突概率最低,并发度也最高(堵塞频率低)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值