设为首页 收藏本站
查看: 396|回复: 0

[经验分享] java事务大总结(一) 先理解数据库的事务以mysql为例

[复制链接]

尚未签到

发表于 2016-10-20 08:31:13 | 显示全部楼层 |阅读模式
一: MYSQL事务处理主要有两种方法。




1、用begin,rollback,commit来实现


begin    开始一个事务






rollback 事务回滚






commit  事务确认





2、直接用




set来改变mysql的自动提交模式





MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过












set
autocommit=0
禁止自动提交




set
autocommit=1
开启自动提交来实现事务的处理。









但注意当你用setautocommit=0的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务









个人推荐使用第一种方法!






MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)





事务的特征:






    • Atomicity(原子性)

    • Consistency(稳定性,一致性)

    • Isolation(隔离性)

    • Durability(可靠性)






注意:


事务只针对对数据数据产生影响的语句有效。


show engines//查看mysql锁支持的数据引擎。





MyISAM不支持事物,InnoDB支持事物。





默认情况下,MySQL将以自动提交模式运行,这意味着没一条小命令都将当做一个只有一条命令的事物来执行。





如果要让mysql支持支持事务,只需要修改数据引擎(alter table person type=INNODB)。





使用start transaction或者begin命令来开启一个事物,使用commit,或者rollback来结束事物。





事物的结束:事物除了commit,rollback会结束外,使用DDL或者DCL语句也会结束。





保存点:通过保存点机制:用户可以在事物里用savepoint name命令设置一些保存点,以后用户在使用rollback to savepoint name结束事物时,name之前的数据保存,之后的数据不保存。





mysql使用事务的关键字









    • begin//打开一个事务。

    • commit //提交到数据库。

    • rollback //取消操作。

    • savepoint //保存,部分取消,部分提交。

    • alter table person type=INNODB//修改数据引擎。






示例:









    • begin



    • updatepersonsetname='efgh'whereid=10



    • select*fromperson



    • rollback



    • select*fromperson






示例:









    • altertablepersontype=INNODB

    • begin

    • updatepersonsetname='efgh'whereid=10

    • select*fromperson

    • commit

    • select*fromperson

    • begin

    • deletefrompersonwhereid=21

    • updatepersonsetname='efgh'whereid=10

    • commit/rollback






针对上面部分提交,必须用到保存点。





事务保存点注意:





1.只能取消到某个保存点rollbackto savepoint p1。





2.不能提交某个保存commit to savepoint p2//错误写法。





3.最后commit把未取消的保存点去不提交到数据。





事务保存点使用例子:









    • begin;

    • updatescoresetscore=40wherescoreid=1;


    • savepoints1;

    • updatescoresetscore=50wherescoreid=2;


    • select*fromscore;

    • rollbacktosavepoints1;

    • select*fromscore;

    • commit;




二:MySQL数据库事务隔离级别



READ UNCOMMITTED 读取未提交的内容





在READ UNCOMMITTED隔离级,所有的事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会产生很多问题,除非用户真的知道自己在做什么,并有很好的理由这样做。本隔离级很少用于实际应用,因为它的性能也不比其他级别好多少,而别的级别还有其他更多的优点。读取未提交数据,也被称为“脏读”(Dirty Read)










READ COMMITTED (读取提交内容)





大多数数据库系统的默认隔离级是READ COMMITED(但这不是MySql默认的)。它满足了隔离的早先简单定义:一个事务在开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的“不可重复读”(NonrepeatableRead)。这意味着用户运行同一语句两次,看到的结果是不同的。










REPEATABLE READ(可重读)(默认)





REPEATABLE READ 隔离级解决了READ UNCOMMITTED隔离导致的问题。他确保同一事务的多个实例在并发读取数据时,看“看到同样的”数据行。不过理论上。这会导致另一个棘手的问题:幻读(Phantom Read)。简单来说,幻读指当前用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围内的数据行时,看发现有新的“幻影”(Phantom)行。InnoDB和Falcon存储引擎通过多个版本并发控制(Multiversion Conccurency Control)机制解决了幻读问题。REPEATABLE
READ 是MySql的默认事务隔离级别。InnoDB和Falcon存储引擎都遵循这种设置










SERIALIZABLE (可串行化)





SERIALIZABLE是最高级别的隔离级别,他通过强制的事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,SERIALIZABLE是在每个读的数据行上加锁。在这个隔离级别,可导致大量的超时(Timeout)现象和锁竞争(Lock Contention)现象。










DSC0000.jpg





三:修改事务隔离级别的方法:



用户可以用SET TRANSACTION语句改变单个会话或者所有新进连接的隔离级别。它的语法如下:




SET[SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}




注意:默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。你需要SUPER权限来做这个。使用SESSION 关键字为将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别。




set @@global.tx_isolation='READ UNCOMMITTED';



你可以用下列语句查询全局和会话事务隔离级别:




SELECT@@global.tx_isolation;


SELECT@@session.tx_isolation;


SELECT@@tx_isolation;

































运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-288636-1-1.html 上篇帖子: FreeBSD 10 + Nginx 1.4.4 + PHP 5.5.9 + MySQL 5.6.15 下篇帖子: 以实用著称的《PHP与MySQL程序设计(第3版)》问世啦!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表