事物的性质
原子性:一个事物里的操作要么都执行,要么都不执行
一致性:事物执行的前后,数据保持完整性
隔离性:一个事物对数据的操作不受别的事物的影响
持久性:一个事物对数据的操作在事物提交后,其对数据的修改时永久的
隔离性带来的问题:
读方面:
读取脏数据: 事物A读取了事物B未提交的数据
不可重复读: 事物A读取了事物B已经提交的数据(update),造成先后读取的数据不一致
虚度: 事物A读取了事物B已经提交的数据(insert),造成先后读取的数据不一致
解决:
设置事物的隔离级别:
read_uncomitted:什么都不能解决
read_comitted:可以解决读取脏数据 (Mysql的默认级别)
repeatable-read:可以解决脏数据和不可重复读 (Oracle的默认级别)
serializable:什么都可以解决
写方面:
悲观锁:
get(Customer.class,1,Lock.LockMode.UPGRADE); 这样在select后就会加上排它锁 即 select ...... for update
乐观锁:
添加一个字段,用来控制版本,注意在配置文件里面使用<version>标签,设置name和column属性
原理,当update的时候会比较当前version字段与当初查询到的version是否一致,若不一致则修改失败,每次修改后都会对version+1