mysql事务

生活中我们讲求做事有始有终,特别是针对一件重要的事
编程从生活而来并高于生活
那么事务的概念也是由实际的需求而产生的

那么我们先来普及一下事务是什么?

官方解释:

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

这里写图片描述
联系生活:

银行转帐操作
张三需要转账给李四500
这时张三的钱-500 , 李四的钱+500
需要执行两个update操作 这次事务完成

事务的特点:

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

存储引擎:

存储引擎要选innodb , 因为myisam不支持事务

建表:

create table t(
id int,
name char(20),
money int
)engine=innodb default charset=utf8;

插入zhangsan与lisi的数据:

insert into t values (1,'zhangsan',5000),(2,'lisi',5000);

zhangsan借给lisi500,给lisi的钱+500

update t set money=money+500 where id=2;

在另外一个窗口查看lisi的钱是否多了500

select * from t;

此时这个事务还没完成
zhangsan的钱还没减500,lisi不应该看到自己多的500

之前就有这种骗术,一个人在柜台存钱,另一个人在ATM取钱
银行职员经过一系列操作,已经将钱转过去了
存钱的人在最后一步确认签字前,告诉银行职员,自己不存钱了
而取钱的人在收到钱的时候立刻就取出来

所以为了防止这种情况的发生,我们可以开启事务,查看一下效果:

start transaction;

先查看两个人各有多少钱,再次给lisi+500

select * from t;
update t set money=money+500 where id=2;

B窗口查看lisi的钱

select * from t;

A窗口应该给zhangsan-500

update t set money=money-500 where id=1;

事务完成,A窗口结束事务

commit;

到这儿,这一整个事务才算完成.这时再去个窗口查看时就都没有问题了;

commite之后,事务就结束了
如果再想使用事务,需要重新 start transaction;
并且想在commit之前,撤回借出的钱
需要用到:rollback(回滚)

start transaction;

update t set money=money+500 where id=2;
update t set money=money-300 where id=1;

rollback;

希望该篇文章对大家有所帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
关于mysql事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System.out.println("事务处理开始!"); con.setAutoCommit(false); // 设置连接不自动提交,即用该连接进行的操作都不更新到数据库 sm = con.createStatement(); // 创建Statement对象 //依次执行传入的SQL语句 for (int i = 0; i < sqls.length; i++) { sm.execute(sqls[i]);// 执行添加事物的语句 } System.out.println("提交事务处理!"); con.commit(); // 提交给数据库处理 System.out.println("事务处理结束!"); // 事务结束 //捕获执行SQL语句组中的异常 } catch (SQLException e) { try { System.out.println("事务执行失败,进行回滚!\n"); con.rollback(); // 若前面某条语句出现异常时,进行回滚,取消前面执行的所有操作 } catch (SQLException e1) { e1.printStackTrace(); } } finally { sm.close(); } } 通常都是上述的写法, 在mysql 不支持事务的时候 , 中间的 setAutoCommit事务操作是不是都不生效. 现在innoDB支持 事务了, 上述的 java 代码是否能实现 以下的 事务隔离的 操作, 在修改的时候处于锁定状态 或者 只可以通过存储过程来实现, 单行的锁定 BEGIN; SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE; --这里for update , 以前用Oracle的时候也是有这个行锁 // ... UPDATE book SET book_number = book_number - 1 WHERE book_id = 123; COMMIT;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值