定义(From 百科)
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
一个逻辑工作单元要成为事务,必须满足所谓的ACID (原子性、一致性、隔离性和持久性) 属性。
事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。
基本特征
原子性
(Atomic)(Atomicity)
原子性表示事务中的操作,要么全部成功,要么全部失败。
一致性
(Consistent)(Consistency)
只有事务执行正常时才被允许,否则事务会将其回滚到最初状态。
隔离性
(Insulation)(Isolation)
事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
持久性
(Duration)(Durability)
事务完成之后,它对于系统的影响是永久性的。
事务语句
-开启事务:START TRANSACTION
-提交事务:COMMIT
-回滚事务:ROLLBACK
数据库三大问题
脏读
一个事务处理过程里读取了另一个未提交的事务中的数据。
一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。
不可重复读
指对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,是由于在查询间隔,被另一个事务修改并提交了数据。
幻读
事务非独立执行时发生一种现象。比如事务读取第一次和读取第二次之间,另一个数据往离插入或删除了数据,造成读取的数据条目不一致。
区别
脏读:读取了无效的数据。
不可重复读:不可重复读的重点是修改。同样的条件, 你读取过的数据, 再次读取出来发现值不一样了。
幻读:幻读的重点在于新增或者删除。同样的条件, 第1次和第2次读出来的记录数不一样。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Serializable | no | no | no |
Repeatable read | no | no | yes |
Read committed | no | yes | yes |
Read uncommitted | yes | yes | yes |
大部分数据库默认:Read committed
MYSQL默认:Repeatable read
脏读、不可重复读、幻读的级别高低是:脏读 < 不可重复读 < 幻读。
数据库事务相关
-------查询当前事务级别------
select @@tx_isolation;
-------设置事务级别----------
set [glogal | session] transaction isolation level 隔离级别名称;
or
set tx_isolation = ’隔离级别名称;’
JDBC设置事务隔离级别
conn.setTransactionLevel(TRANSACTION_SERIALIZABLE);
Spring 设置事务隔离级别
<property name="transactionAttributes">
<props>
<prop key="*">ISOLATION_READ_COMMITTED</prop>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>