事务的基本要素(ACID):
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
事务的并发问题:
脏读:事务A读取事务B更新的数据后,事务B进行了回滚操作,那么事务A读到的数据就是脏数据
不可重复度:事务A多次读取同一数据,事务B在事务A读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读:一个事务在前后两次查询同一范围的时候,后一次查询到了前一次查询没有看到的行
数据库事务隔离级别:
数据库默认隔离级别: mysql ---repeatable,oracle,sql server ---read commited
mysql binlog的格式三种:statement,row,mixed
为什么mysql用的是repeatable而不是read committed:在 5.0之前只有statement一种格式,而主从复制存在了大量的不一致,故选用repeatable
为什么默认的隔离级别都会选用read commited 原因有二:repeatable存在间隙锁会使死锁的概率增大,在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行
在RC级用别下,主从复制用什么binlog格式:row格式,是基于行的复制!
事务隔离级别 | 脏读 | 不可重复读 | 幻读 | 锁方式 |
读未提交(read-uncommitted) | 是 | 是 | 是 | 无锁 |
不可重复读(read-committed) | 否 | 是 | 是 | 行锁 |
可重复读(repeatable-read) | 否 | 否 | 是 | 查询列有索引:行锁+间隙锁 查询列无索引:表锁 |
串行化(serializable) | 否 | 否 | 否 | 表锁 |
Spring 事务隔离级别:
ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应。
ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
Spring 事务的传播属性:
Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
Propagation.REQUIRES_NEW:表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。
Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
Propagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。