Skip to content

Instantly share code, notes, and snippets.

@zw963
Created January 15, 2022 17:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zw963/224e01eed8784c92ef6f4aa732d183dc to your computer and use it in GitHub Desktop.
Save zw963/224e01eed8784c92ef6f4aa732d183dc to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
raise e
end
gemfile(true) do
source "https://rubygems.org"
gem 'pg'
gem 'sequel'
gem 'minitest'
gem 'database_cleaner-sequel'
end
system("sudo -u postgres dropdb --if-exists check_sequel_db")
system("sudo -u postgres createdb check_sequel_db")
DB = Sequel.postgres("check_sequel_db")
DB.create_table(:insiders, :ignore_index_errors=>true) do
primary_key :id
Integer :number_of_shares, :null=>false
end
class Insider < Sequel::Model
end
ENV['RACK_ENV'] = 'test'
require 'minitest/autorun'
require 'minitest/pride'
require 'database_cleaner-sequel'
DatabaseCleaner[:sequel].strategy = :truncation
# require 'logger'
# LOGGER = Logger.new($stdout)
# DB.loggers << LOGGER
describe 'insider' do
it 'test postgres read committed mode default lock' do
100.times do |i|
sleep 1
puts i+1
Insider.create(number_of_shares: 200)
puts "Insider count outer thread: #{Insider.count}"
thread1 = Thread.new do
sleep rand(0.1..0.2)
DB.transaction do
puts "Insider count inner first thread: #{Insider.count}"
insider_1 = Insider.last
insider_1.update(number_of_shares: insider_1.number_of_shares - 10)
end
end
thread2 = Thread.new do
sleep rand(0.1..0.2)
DB.transaction do
insider_2 = Insider.last
insider_2.update(number_of_shares: insider_2.number_of_shares - 10)
end
end
thread1.join
thread2.join
assert_equal 180.0, Insider.last.number_of_shares
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment