首页 > 数据库 >mysql的for update

mysql的for update

时间:2024-01-11 11:33:06浏览次数:39  
标签:PDO name age update st pdo mysql

For update是MySQL中用于实现行锁的一种语法,其主要作用是在SELECT查询语句中加上FOR UPDATE子句,以保证查询结果集中的每一行都被锁定,避免其他事务对这些行进行修改。

SELECT ... FROM table_name WHERE ... FOR UPDATE;

在执行For update语句时,MySQL会首先获取表级共享锁,然后再根据WHERE条件锁定符合条件的行。需要注意的是,For update语句会将锁定的行一直锁定到事务结束,因此在使用时需要考虑是否会导致死锁的问题,并尽量缩小锁定的范围。如果where查询的字段没有索引,那么MySQL就会对整个表进行表级锁定,而不是对查询结果集中的行进行行级锁定。

因此For update应用场景:高并发下查询字段带有索引最好是查询结果唯一。

$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
$user = "root";
$password = "";
#持久连接
$pdo = new PDO($dsn, $user, $password, [PDO::ATTR_PERSISTENT => true]);
#设置获取值的方式
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
#设置报错模式,默认报错模式为silent模式:不会主动报错,还有警告模式:错误发生后通过php标准报告错误,异常模式:错误发生后抛出异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

#事务
try {
  $pdo->beginTransaction();
  $st = $pdo->prepare('select name,age from test where id=1 for update');
  $st->execute();
  list($name,$age) = $st->fetch();
  
  $name = 'aa';
  $age = 19;
  $st = $pdo->prepare("update test set name=:name,age=:age where id=1");
  $st->execute(compact('name','age'));

  $pdo->commit();
} catch (Exception $error) {
  $pdo->rollBack();
  echo 'transaction failed';
}

 

幂等性

幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

标签:PDO,name,age,update,st,pdo,mysql
From: https://www.cnblogs.com/caroline2016/p/17958176

相关文章

  • Go+Gin+xorm+MySql实现增删改查
    一、概述承接上一篇(ps:原生增删改查),本篇使用xorm实现增删改查。之所以要使用xrom是因为xrom可以极大的缩小操作数据库的成本。使用rom之前需要导入响应的包gogetgithub.com/go-xorm/xorm#安装xormgogetxorm.io/coregoget-ugithub.com/go-sql-driver/mys......
  • mysql修改json字段sql备份
    updatedec_maina,dec_main_copy20240110bseta.ie_Date=b.ie_Date,a.declaration_data=b.declaration_data,a.custom_state=b.custom_state,a.content=JSON_SET(a.cont......
  • mysql实现数据文件存储到指定分区
    通过rpm安装的mysql默认程序文件放在/usr/bin,数据文件放在/var/lib/mysql,需要将数据文件放在不同分区,保证数据量时将根目录撑爆一、关闭数据库[root@node1bin]#systemctlstopmysqld[root@node1bin]#systemctlstatusmysqld●mysqld.service-MySQLServerLoaded:lo......
  • MySQL InnoDB ReplicaSet安装文档
    MySQL副本集介绍MySQLInnoDBReplicaSet(也叫MySQL副本集,有些地方也翻译成MySQL复制集)是在MySQL8.0.19版本(2020-01-13Released)之后开始支持的,MySQL副本集中拥有一个primary节点,一个或多个secondary节点,它不像MySQLInnoDBCluster一样提供故障自愈和多主模式,但是它提供手......
  • MySQL Ignoring the redo log due to missing MLOG_CHECKPOINT between the checkpoin
    错误信息:2023-12-12T09:32:31.383149Z0[ERROR]InnoDB:IgnoringtheredologduetomissingMLOG_CHECKPOINTbetweenthecheckpoint5777611209andtheend5777612857.2023-12-12T09:32:31.384149Z0[ERROR]InnoDB:PlugininitializationabortedwitherrorGeneri......
  • 揭秘MySQL中的"黑洞":为什么你应避免默认使用NULL值?
    摘要:在MySQL中,NULL值是一种特殊的标记,表示数据缺失或未知。然而,默认使用NULL值可能会引发一系列问题。本文将深入探讨为什么不建议默认使用NULL值,并通过具体示例揭示其潜在风险。一、什么是NULL值?在MySQL中,NULL表示一个字段没有值或数据未知。不同于空字符串("")或0,NULL表示缺失或......
  • InnoDB delete-update加锁流程分析
    死锁原因:并发事务在执行过程中,因争夺锁资源而造成互相等待。加锁顺序导致死锁:不同表加锁顺序相反、相同表不同行加锁顺序相反,其中相同表不同行加锁顺序相反造成死锁有很多变种,其中容易忽略的是给辅助索引行加锁的时候,同时会给聚集索引行加锁;同时还可能出现在外键索引时,给父表加......
  • Linux安装MySQL5.7并设置systemd方式管理
    1、安装前检查1)检查linux系统是否安装过mysql#检查系统中有无安装过mysql,如果有就卸载rpm-qa|grepmysqlrpm-e--nodepsmysql-xxxx#检查所有mysql对应的文件夹,全部删除whereismysqlfind/-namemysqlrm-rf......#删除mysql的配置文件rm-rf/etc/my.cnf#删......
  • MySQL运维实战(2.4) SSL认证在MySQL中的应用
    作者:俊达引言MySQL支持使用TLS协议进行通信,该协议在数据库通信中具有关键作用。首先,TLS能够加密客户端与服务端之间的通信数据,涵盖了客户端发送至服务端的SQL请求以及服务端返回给客户端的数据,从而确保敏感信息的保密性和完整性。除此之外,TLS还允许客户端验证服务端的身份,确保安......
  • win11安装mysql(解压版)
    一、官网下载https://dev.mysql.com/downloads/mysql/二、配置环境变量设置>系统>系统信息>高级系统设置三、配置my.inimysql根目录下创建my.ini1[mysqld]2;设置3306端口3port=33064;设置mysql的安装目录5basedir=D:\\XX\\mysql-8.0.18-winx646;设置my......