Spring 声明式事务
概述:
编程式事务
:在业务代码中添加事务控制代码,这样的事务控制机制就叫做编程式事务
声明式事务
:通过xml或者注解配置的?式达到事务控制的?的,叫做声明式事务
事务的四?特性
原?性
(Atomicity) 原?性是指事务是?个不可分割的?作单位,事务中的操作要么都发?,要么都不发?。
从操作的?度来描述,事务中的各个操作要么都成功要么都失败
?致性
(Consistency) 事务必须使数据库从?个?致性状态变换到另外?个?致性状态。
例如转账前A有1000,B有1000。转账后A+B也得是2000。
?致性是从数据的?度来说的,(1000,1000) (900,1100),不应该出现(900,1000)
隔离性
(Isolation) 事务的隔离性是多个?户并发访问数据库时,数据库为每?个?户开启的事务,每个事务不能被其他事务的操作数据所?扰,多个并发事务之间要相互隔离。
?如:事务1给员?涨?资2000,但是事务1尚未被提交,员?发起事务2查询?资,发现?资涨了2000块钱,读到了事务1尚未提交的数据(脏读)
持久性
(Durability)
持久性是指?个事务?旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发?故障也不应该对其有任何影响。
事务的隔离级别
不考虑隔离级别,会出现以下情况:(以下情况全是错误的),也即为隔离级别在解决事务并发问题
脏读
:?个线程中的事务读到了另外?个线程中未提交
的数据。
不可重复读
:?个线程中的事务读到了另外?个线程中已经提交的update
的数据(前后内容不?样)
场景:
员?A发起事务1,查询?资,?资为1w,此时事务1尚未关闭财务?员发起了事务2,给员?A张了2000块钱,并且提交了事务
员?A通过事务1再次发起查询请求,发现?资为1.2w,原来读出来1w读不到了,叫做不可重复读
虚读(幻读
):?个线程中的事务读到了另外?个线程中已经提交的insert
或者delete
的数据(前后条数不?样)
场景:
事务1查询所有?资为1w的员?的总数,查询出来了10个?,此时事务尚未关闭
事务2财务?员发起,新来员?,?资1w,向表中插?了2条数据,并且提交了事务
事务1再次查询?资为1w的员?个数,发现有12个?,?了?了
数据库共定义了四种隔离级别:
Serializable(串?化
):可避免脏读、不可重复读、虚读情况的发?。(串?化) 最?
Repeatable read(可重复读)
:可避免脏读、不可重复读情况的发?。(幻读有可能发?) 第?该机制下会对要update的?进?加锁
Read committed(读已提交)
:可避免脏读情况发?。不可重复读和幻读?定会发?。 第三
Read uncommitted(读未提交
):最低级别,以上情况均?法保证。(读未提交) 最低
注意:
级别依次升?,效率依次降低
MySQL的默认隔离级别是:REPEATABLE READ
查询当前使?的隔离级别: select @@tx_isolation;
设置MySQL事务的隔离级别: set session transaction isolation level xxx; (设置的是当前mysql连接会话的,并不是永久改变的)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!