1、事务的基本概念(ACID):
A:atomicity(原子性):表示一个事务内的所有操作是一个整体,要么全部成功,要么全失败
C:consistency(一致性):表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态
I:isolation(隔离性):事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据
D:durability(持久性):事务完成后,它对系统的影响是持久性的
2、事务隔离级别(从低到高)
读取未提交(Read Uncommitted)
- 这是最低的事务隔离级别,读事务不会阻塞读事务和写事务(读时可读可写),写事务也不会阻塞读事务,写事务会阻塞写事务(写时可读不可写)
- 写事务不阻塞读事务,可以读取未提交的数据,容易造成脏读问题
- 脏读解决方案:如果在第一个事务提交前,任何事务不可读取其修改过的值,则可以避免该问题
读取已提交(Read Committed)
- 读事务不阻塞读事务和写事务(读时可读可写),写事务阻塞读事务和写事务(写时不可读写)
- 读事务不阻塞写事务有可能造成不可重复度问题(在同一个事务中再次读取事务时(select操作),所读取的数据和上一次读取的数据结果不一致)【修改update事务发生率高】
- 不可重复读解决方案:锁住已经查询出来的记录,不让其他事务进行写操作
可重复读(Repeatable Read)
- 读事务会阻塞写事务,读事务不会阻塞读事务(读时可读不可写),写事务阻塞读事务和写事务(写时不可读写)
- 读事务不阻塞读事务(针对的是记录而不是表),可能会造成幻读问题【新增insert/删除delete事务发生率高】
- 幻读解决方案:解决办法是锁表,不让产生幻读的记录插入和删除,项目中一般不考虑幻读问题
序列化(Serializable)
- 此隔离级别是最严格的隔离级别,如果设置成这个隔离级别,那么就不会出现以上所有问题(脏读、不可重复的、幻读)
- 性能极低,一般不用
3、一般采用读取已提交,配合各种并发访问控制策略来达到并发事务控制的目的。
hibernate使用(配置hibernate.cfg.xml)
<!-- 制定事务隔离级别:1、2、4、8对应二进制0001、0010、0100、1000,采用位运算。权限控制经常采用二进制位运算 --> <property name="hibernate.connection.isolation">2</property>