有了事务,为什么还要用同步锁?

z1214178827 2017-03-13 08:18:24
我看网上好多都是有了事务管理,却还用同步锁保证并发不出错。事务使用数据库自带的锁,可以锁住表,避免出现不可重复读、脏读和幻读。对于存在于事务中的

//获取用户select
//删除用户

为什么还要用synchronied保证不会删除不存在的用户呢呢?
...全文
2052 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_19940807 2019-07-13
  • 打赏
  • 举报
回复
事务是保证多个sql或者跨多个数据库操作,能原子操作。而锁是控制代码层面防止多个并发造成数据不一致性。
「已注销」 2018-07-13
  • 打赏
  • 举报
回复
事务是事务,并发是并发。
  • 打赏
  • 举报
回复
事务有级别,有的仅仅是锁住了一条数据而已,如果都锁住整张表的话,系统效率会降低
有的时候并不需要在那么大范围内加锁
所以改用syn关键字,灵活的控制锁的范围
zhuailhw123 2018-07-03
  • 打赏
  • 举报
回复
觉得八楼的解释或许说的过去
「已注销」 2018-07-01
  • 打赏
  • 举报
回复
事务不能保证并发,事务只是保证一次提交多个sql要么都成功要么都失败,事务的本质也是调用数据库的排它锁和共享锁。要保证一个事务中只有一个线程,就需要java同步锁。
is_Min 2017-03-21
  • 打赏
  • 举报
回复
觉得八楼的解释或许说的过去
is_Min 2017-03-21
  • 打赏
  • 举报
回复
引用 6 楼 u014689192 的回复:
我是这样理解的,事务针对的是一个数据库连接或是一个线程内的不同操作,要么全部完成要么全部失败,而同步锁是针对多个连接或多个线程来说的,这个是由隔离级别保证的
事务不是也针对多个数据库连接的么?
is_Min 2017-03-21
  • 打赏
  • 举报
回复
引用 3 楼 yql1986 的回复:
[quote=引用 楼主 z1214178827 的回复:] 我看网上好多都是有了事务管理,却还用同步锁保证并发不出错。事务使用数据库自带的锁,可以锁住表,避免出现不可重复读、脏读和幻读。对于存在于事务中的 { //获取用户select //删除用户 } 为什么还要用synchronied保证不会删除不存在的用户呢呢?
这样理解。 synchronied是保证上面的操作原子性,因为上面有两个操作 一个是select动作,还有一个是delete动作。现假设有两个线程执行这一段代码,且执行的时间窗口有重叠 。 线程一和同时执行了select 语句,都获得了用户了,然后线程一发送“删除用户”给令给数据库,然后线程二也发送“删除用户”给令给数据库。即两个线程同时执行select操作,但执行删除操作的时候 一前一后 就会出现 删除不存在的用户 。 因为线程一 已经删除了用户 但是线程二却不知道。 加synchronied后,两个线程执行这一段代码没有任何时间重叠,两个组合操作变成了一个原子操作 [/quote]当事务的隔离级别是seriazeble的时候不是杜绝了这种虚读的情况了吗,您的举例不太好吧。
  • 打赏
  • 举报
回复
两个维度的东西 ...
z1214178827 2017-03-15
  • 打赏
  • 举报
回复
在事务的锁的级别很高的情况下,其实是不需要再用synchronied的;有时为了减轻数据库压力,放宽事务的锁,把压力放在应用服务器上,也就使用了同步锁
  • 打赏
  • 举报
回复
我是这样理解的,事务针对的是一个数据库连接或是一个线程内的不同操作,要么全部完成要么全部失败,而同步锁是针对多个连接或多个线程来说的,这个是由隔离级别保证的
yql1986 2017-03-14
  • 打赏
  • 举报
回复
现假设数据库的事务默认隔离级别是读取已提交的数据 现假设当在事务中执行select动作的时候,有另外一个线程在事务中执行插入动作且插入的数据已经提交给数据库 则数据库会保证select动作一定会读取到刚刚插入的数据,这就是事务。
yql1986 2017-03-14
  • 打赏
  • 举报
回复
引用 楼主 z1214178827 的回复:
我看网上好多都是有了事务管理,却还用同步锁保证并发不出错。事务使用数据库自带的锁,可以锁住表,避免出现不可重复读、脏读和幻读。对于存在于事务中的 { //获取用户select //删除用户 } 为什么还要用synchronied保证不会删除不存在的用户呢呢?
这样理解。 synchronied是保证上面的操作原子性,因为上面有两个操作 一个是select动作,还有一个是delete动作。现假设有两个线程执行这一段代码,且执行的时间窗口有重叠 。 线程一和同时执行了select 语句,都获得了用户了,然后线程一发送“删除用户”给令给数据库,然后线程二也发送“删除用户”给令给数据库。即两个线程同时执行select操作,但执行删除操作的时候 一前一后 就会出现 删除不存在的用户 。 因为线程一 已经删除了用户 但是线程二却不知道。 加synchronied后,两个线程执行这一段代码没有任何时间重叠,两个组合操作变成了一个原子操作
yql1986 2017-03-14
  • 打赏
  • 举报
回复
引用 楼主 z1214178827 的回复:
我看网上好多都是有了事务管理,却还用同步锁保证并发不出错。事务使用数据库自带的锁,可以锁住表,避免出现不可重复读、脏读和幻读。对于存在于事务中的 { //获取用户select //删除用户 } 为什么还要用synchronied保证不会删除不存在的用户呢呢?
这样理解。 synchronied是保证上面的操作原子性,因为上面有两个操作 一个是select动作,还有一个是delete动作。现假设有两个线程执行这一段代码,且执行的时间窗口有重叠 。 线程一和同时执行了select 语句,都获得了用户了,然后线程一发送“删除用户”给令给数据库,然后线程二也发送“删除用户”给令给数据库。即两个线程同时执行select操作,但执行删除操作的时候 一前一后 就会出现 删除不存在的用户 。 因为线程一 已经删除了用户 但是线程二却不知道。 加synchronied后,两个线程执行这一段代码没有任何时间重叠,两个组合操作变成了一个原子操作
土豆的老公 2017-03-14
  • 打赏
  • 举报
回复
如果部署多个节点,synchronied其实是没多大意义的。 可以使用乐观锁。
z1214178827 2017-03-13
  • 打赏
  • 举报
回复
但是事务不就是为了解决并发吗?
我爱娃哈哈 2017-03-13
  • 打赏
  • 举报
回复
并发吧

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧