Mysql中的事务:
a.mysql引擎是支持事务的
b.mysql默认自动提交事务。每条语句都处在单独的事务中。
c.手动控制事务
开启事务:start transaction|begin
提交事务:commit
回滚事务:rollback
JDBC如何控制事务的呢? 看下图
事务的特性有哪些呢?
1、原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。例如转账前和转账后的总金额不变。
3、隔离性:事务的隔离性指的就是多个用户并发访问数据库的时候,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事物之间要相互隔离。
4、持久性:指一个事务一旦被提交了,他对数据库中的改变就是永久性的,接下来即使数据发生故障也不应该对其有任何影响。
事务的隔离级别: 4
脏读:指一个事务读取了另一个事务未提交的数据。
不可重复读:在一个事务内读取表中的谋一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。 update
虚读 (幻读):在一个事务内读取到了别的事务插入的数据,导入前后读取不一致 insert
数据库设置事务的隔离级别防止以上情况的发生:
1、READ UNCOMMITTED: 脏读 不可重复读 虚读 都有可能发生
2、READ COMMITTED : 避免脏读。 不可重复读,虚读可能发生。(oracle默认)
4、REPEATABLE READ:避免脏读、不可重复读。虚读可能发生。(mysql默认)
8、SERIALIZABLE:避免脏读、不可重复读、虚读
级别越高,性能越低,数据越安全。
mysql:查看当前事务的隔离级别: SELECT @@TX_ISOLATION;
更改当前事务的隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。
设置隔离级别必须在提交事务之前。
JDBC控制事务的隔离级别:
Connection接口
设置隔离级别,必须在事务开启之前。
Connection.setTransactionIsolation(int levlel);