mysql的for update

发布时间 2024-01-11 11:32:12作者: carol2014

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';
}

 

幂等性

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