事务:
* 事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!!
事务特性:
* 原子性:事务一组操作不可分割.
* 一致性:事务的执行前后,数据完整性要保持一致.
* 隔离性:一个事务在执行的过程中不应该受到其他事务的干扰.
* 持久性:一旦事务结束,数据就永久保存数据库.
如果不考虑事务的隔离性引发一些安全性问题:
* 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
);
解决丢失更新的方法:在数据表中添加版本字段,每次修改过记录后,版本字段都会更新,如果读取的版本字段与修改时不一致,证明被修改过