事务 四大特性 mysql 悲观锁与乐观锁

版权声明:本文为博主原创文章,转载请注明出处,谢谢! https://blog.csdn.net/u010094934/article/details/53073780

事务:
* 事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!!
 
事务特性:
* 原子性:事务一组操作不可分割.
* 一致性:事务的执行前后,数据完整性要保持一致.
* 隔离性:一个事务在执行的过程中不应该受到其他事务的干扰.
* 持久性:一旦事务结束,数据就永久保存数据库.
 
如果不考虑事务的隔离性引发一些安全性问题:
* 5大类问题:3类读问题2类写问题.
* 读问题:
* 脏读:一个事务读到另一个事务未提交数据.
* 不可重复读:一个事务读到另一个事务已经提交数据(update),导致查询结果不一致.
* 虚读:一个事务读到另一个事务已经提交的数据(insert),导致查询结果不一致
 
* 避免三种读的问题:
* 设置事务的隔离级别:
* 未提交读:以上三种读问题 都有可能发生.
* 已提交读:避免脏读,但是不可重复读和虚读有可能发生.
* 重复读:避免脏读和不可重复读,但是虚读是有可能发生.
* 串行的:可以避免以上三种读问题.
 
* 在Hibernate中设置事务的隔离级别:
* 在核心配置文件中:
<property name="hibernate.connection.isolation">4</property>
 

悲观锁     假设丢失更新一定会发生    利用数据库内部锁机制,管理事务

  mysql数据库内部提供两种常用的锁机制  共享锁(读锁)和排它锁(写锁)  锁必须在事务中添加,事务结束了锁就释放了

  允许一张数据表中数据记录添加多个共享锁,添加共享锁记录,对于其他事务可读不可写

                                                 可添加一个排他锁,防止其他事务修改

   mysql添加 共享锁方式   select * from  account lock  in share mode;

   mysql添加 排他锁方式   select * from  account  for  update;

   解决丢失更新的方法:事务在修改记录过程中,锁定记录,别的事务无法并发修改

乐观锁    采用记录的版本字段,来判断记录是否修改过

timestamp   可以自动更新

create table  product(

  id int,

  name varchar(20),

  updatetime timestamp

);

  解决丢失更新的方法:在数据表中添加版本字段,每次修改过记录后,版本字段都会更新,如果读取的版本字段与修改时不一致,证明被修改过



展开阅读全文

没有更多推荐了,返回首页