并发访问时,在数据库如何安全地修改同一行数据

要安全的修改同一行数据,就要保证一个线程在修改时其它线程无法更新这行记录。

在这种情况下可以考虑使用悲观锁。悲观锁设定每次修改都会冲突。 本质是当前只有一个线程执行操作,结束了唤醒其他线程进行处理。

Mysql中的有两种方法:select…for updatelock in share mode

Select...for update的实现方式:

          set autocommit =0;//关闭自动提交

          begin;//开始事务

          select * from order where id=989879 for update;//查询信息

          update order set name='names';//修改信息

          commit;//提交事务

执行select…for update时,般的SELECT查询则不受影响。

Lock in share mode的是实现方式:

          set autocommit =0;//关闭自动提交

          begin;//开始事务

          select * from order where id=989879 lock in share mode;//锁定查询的字段

          update order set name='names';//修改信息

          commit;//提交事务

lock in share mode或select…for update是在事务内起作用的,涉及行锁的概念。能保证当前session事务锁定的行不被其他session所修改。前者属于共享锁,允许其他事务添加共享锁,不允许其他事务修改或者加排它锁。后者属于排它锁,不允许其他事务添加共享锁和排它锁,也不允许修改。

一般情况下推荐使用select…for update。使用lock in share mode时需要注意死锁的问题,就是如果两个session同时对一行加锁,那么将无法执行修改,必须等一个session退出以后才能执行。如果有两个session加锁后同时修改一行,那么将有一个session被引擎强制关闭并重启,这样另一个session的修改就可以顺利执行。如果只有一个session修改,另一个session不做修改动作,那么这个尝试修改的session将会一直等待锁被释放才能继续执行。

你可能感兴趣的:(数据库)